如果python数据帧字符串列缺少值,如何小写?

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)

  • `type(s) == str` 应该改为 `isinstance(s, str)` (2认同)

Ara*_*_gn 10

应用 lambda 函数

df['original_category'] = df['original_category'].apply(lambda x:x.lower())
Run Code Online (Sandbox Code Playgroud)


Woj*_*zak 6

可能的解决方案:

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)

虽然不确定效率。


cs9*_*s95 6

Pandas >= 0.25:删除大小写差异 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() 中的字符串匹配和转换为小写