Следующий код не работает.
import pandas as pd
import numpy as np
df=pd.DataFrame(['ONE','Two', np.nan],columns=['x'])
xLower = df["x"].map(lambda x: x.lower())
Как мне настроить его, чтобы получить xLower = ['one', 'two', np.nan]? Эффективность важна, поскольку реальный фрейм данных огромен.
python
string
pandas
missing-data
П.Эскондидо
источник
источник
str.casefold
для более агрессивных сравнений строк сворачивания регистра. Больше информации в этом ответе .Ответы:
использовать векторизованные строковые методы pandas ; как в документации:
.str.lower()
это самый первый пример;>>> df['x'].str.lower() 0 one 1 two 2 NaN Name: x, dtype: object
источник
10000 loops, best of 3: 96.4 µs per loop
сравнению с10000 loops, best of 3: 125 µs per loop
Другое возможное решение, если в столбце есть не только строки, но и числа, - использовать
astype(str).str.lower()
илиto_string(na_rep='')
потому что в противном случае, учитывая, что число не является строкой, при уменьшении оно вернетсяNaN
, поэтому:import pandas as pd import numpy as np df=pd.DataFrame(['ONE','Two', np.nan,2],columns=['x']) xSecureLower = df['x'].to_string(na_rep='').lower() xLower = df['x'].str.lower()
тогда у нас есть:
>>> xSecureLower 0 one 1 two 2 3 2 Name: x, dtype: object
и нет
>>> xLower 0 one 1 two 2 NaN 3 NaN Name: x, dtype: object
редактировать:
если вы не хотите терять NaN, тогда будет лучше использовать карту (из комментариев @ wojciech-walczak и @ cs95) это будет выглядеть примерно так
xSecureLower = df['x'].map(lambda x: x.lower() if isinstance(x,str) else x)
источник
вы также можете попробовать это,
df= df.applymap(lambda s:s.lower() if type(s) == str else s)
источник
type(s) == str
вместо этого должно бытьisinstance(s, str)
Возможное решение:
import pandas as pd import numpy as np df=pd.DataFrame(['ONE','Two', np.nan],columns=['x']) xLower = df["x"].map(lambda x: x if type(x)!=str else x.lower()) print (xLower)
И результат:
0 one 1 two 2 NaN Name: x, dtype: object
Хотя не уверен в эффективности.
источник
isinstance
при проверке типа объекта.Pandas> = 0,25: удалить различия в регистре с помощью
str.casefold
Начиная с v0.25, я рекомендую использовать "векторизованный" строковый метод,
str.casefold
если вы имеете дело с данными в Юникоде (он работает независимо от строки или юникода):s = pd.Series(['lower', 'CAPITALS', np.nan, 'SwApCaSe']) s.str.casefold() 0 lower 1 capitals 2 NaN 3 swapcase dtype: object
См. Также связанную проблему GitHub GH25405 .
casefold
поддается более агрессивному сравнению со складыванием корпуса. Он также изящно обрабатывает NaN (точно такstr.lower
же).Но почему так лучше?
Разница видна с юникодами. Взяв пример из документации Python
str.casefold
,Сравните вывод
lower
для,s = pd.Series(["der Fluß"]) s.str.lower() 0 der fluß dtype: object
Versus
casefold
,s.str.casefold() 0 der fluss dtype: object
Также см. Python: lower () vs. casefold () в сопоставлении строк и преобразовании в нижний регистр .
источник
Может использоваться понимание списка
import pandas as pd import numpy as np df=pd.DataFrame(['ONE','Two', np.nan],columns=['Name']}) df['Name'] = [str(i).lower() for i in df['Name']] print(df)
источник
Применить лямбда-функцию
df['original_category'] = df['original_category'].apply(lambda x:x.lower())
источник
Используйте функцию применения,
Xlower = df['x'].apply(lambda x: x.upper()).head(10)
источник
(Efficiency is important since the real data frame is huge.)
и есть еще несколько ответов, пожалуйста, постарайтесь показать, какой из них является хорошей точкой вашего ответа.скопируйте столбец Dataframe и просто примените
df=data['x'] newdf=df.str.lower()
источник