以下代码不起作用。
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]?效率很重要,因为实际数据帧很大。
Answers:
使用熊猫矢量化字符串方法; 如文档中所示:
这些方法自动排除丢失/ NA值
.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,则使用map会更好,(来自@ wojciech-walczak和@ cs95注释)它将看起来像这样
xSecureLower = df['x'].map(lambda x: x.lower() if isinstance(x,str) else x)
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
另请参阅相关的GitHub问题GH25405。
casefold
适用于更具侵略性的案例折叠比较。它还可以优雅地处理NaN(与之类似str.lower
)。
unicode可以看出差异。以python str.casefold
docs中的示例为例,
大小写折叠类似于小写字母,但更具攻击性,因为它旨在消除字符串中的所有大小写区别。例如,德语小写字母
'ß'
等效于"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
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.)
并且还有更多答复,请尝试揭示哪一个是您回答的重点。
str.casefold
进行更具侵略性的案例折叠字符串比较。有关此答案的更多信息。