Подтвердить что ты не робот

Как сделать строчный столбец 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]? Эффективность важна, так как реальный фрейм данных огромен.

4b9b3361

Ответ 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)