P.E*_*ido 60 python string missing-data pandas
以下代码不起作用.
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())
Run Code Online (Sandbox Code Playgroud)
如何调整它以获得xLower = ['one','two',np.nan]?效率很重要,因为真正的数据框架是巨大的.
beh*_*uri 137
使用pandas 矢量化字符串方法 ; 如在文档中:
这些方法会自动排除缺失/ NA值
.str.lower() 是那里的第一个例子;
>>> df['x'].str.lower()
0 one
1 two
2 NaN
Name: x, dtype: object
Run Code Online (Sandbox Code Playgroud)
Mik*_*e W 14
另一种可能的解决方案,如果列不仅有字符串而且数字也是如此,astype(str).str.lower()因为否则,如果数字不是字符串,则降低时它将返回to_string(na_rep=''),因此:
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()
Run Code Online (Sandbox Code Playgroud)
然后我们有:
>>> xSecureLower
0 one
1 two
2
3 2
Name: x, dtype: object
Run Code Online (Sandbox Code Playgroud)
并不是
>>> xLower
0 one
1 two
2 NaN
3 NaN
Name: x, dtype: object
Run Code Online (Sandbox Code Playgroud)
小智 10
你也可以试试这个
df= df.applymap(lambda s:s.lower() if type(s) == str else s)
Run Code Online (Sandbox Code Playgroud)
Ara*_*_gn 10
df['original_category'] = df['original_category'].apply(lambda x:x.lower())
Run Code Online (Sandbox Code Playgroud)
可能的解决方案:
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)
Run Code Online (Sandbox Code Playgroud)
结果是:
0 one
1 two
2 NaN
Name: x, dtype: object
Run Code Online (Sandbox Code Playgroud)
虽然不确定效率。
str.casefold从 v0.25 开始,str.casefold如果您正在处理 unicode 数据,我建议使用“矢量化”字符串方法(无论是字符串还是 unicode,它都可以工作):
s = pd.Series(['lower', 'CAPITALS', np.nan, 'SwApCaSe'])
s.str.casefold()
0 lower
1 capitals
2 NaN
3 swapcase
dtype: object
Run Code Online (Sandbox Code Playgroud)
另请参阅相关的 GitHub 问题GH25405。
casefold有助于更积极的案例折叠比较。它还可以优雅地处理 NaN(就像那样str.lower)。
使用 unicode 可以看到差异。以pythonstr.casefold文档中的示例为例,
Casefolding 类似于小写,但更具侵略性,因为它旨在消除字符串中的所有大小写区别。例如,德语小写字母
'ß'相当于"ss". 由于它已经是小写字母,lower()因此不会对'ß';casefold()将其转换为"ss".
比较lowerfor的输出,
s = pd.Series(["der Fluß"])
s.str.lower()
0 der fluß
dtype: object
Run Code Online (Sandbox Code Playgroud)
与casefold,
s.str.casefold()
0 der fluss
dtype: object
Run Code Online (Sandbox Code Playgroud)
另请参阅Python:lower() 与 casefold() 中的字符串匹配和转换为小写。