Как сделать строчный столбец pandas dataframe, если в нем отсутствуют значения?
Следующий код не работает.
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]?
Эффективность важна, так как реальный фрейм данных огромен.
Ответы
Ответ 1
использовать pandas векторизованные строковые методы; как в документации:
эти методы автоматически исключают отсутствующие /NA значения
.str.lower()
- это самый первый пример:
>>> df['x'].str.lower()
0 one
1 two
2 NaN
Name: x, dtype: object
Ответ 2
Другое возможное решение, если в столбце есть не только строки, но и числа, - это использовать 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)
Ответ 3
Возможное решение:
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
Не уверен насчет эффективности, хотя.
Ответ 4
Панды> = 0,25: удалить различия в str.casefold
с помощью str.casefold
Начиная с версии 0.25, я рекомендую использовать строковый метод " str.casefold
если вы работаете с данными в str.casefold
Unicode (работает независимо от строки или str.casefold
Unicode):
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
,
Свертывание регистров похоже на нижний регистр, но более агрессивно, потому что оно предназначено для удаления всех различий регистра в строке. Например, немецкая строчная буква 'ß'
эквивалентна "ss"
. Поскольку это уже строчные буквы, lower()
ничего не будет делать с 'ß'
; casefold()
преобразует его в "ss"
.
Сравните вывод lower
для,
s = pd.Series(["der Fluß"])
s.str.lower()
0 der fluß
dtype: object
По сравнению с casefold
,
s.str.casefold()
0 der fluss
dtype: object
Также смотрите Python: lower() и casefold() в сопоставлении строк и преобразовании в нижний регистр.
Ответ 5
Вы можете попробовать это тоже,
df= df.applymap(lambda s:s.lower() if type(s) == str else s)
Ответ 6
Может быть использование списка понимания
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)
Ответ 7
скопируйте ваш столбец Dataframe и просто примените
df = data ['x'] newdf = df.str.lower()
Ответ 8
Используйте функцию применения,
Xlower = df ['x']. Apply (лямбда x: x.upper()). Head (10)