如果熊猫数据框字符串列缺少值,如何将其小写?


84

以下代码不起作用。

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]?效率很重要,因为实际数据帧很大。


从v0.25开始,我建议您str.casefold进行更具侵略性的案例折叠字符串比较。有关此答案的更多信息。
cs95,19年

Answers:


180

使用熊猫矢量化字符串方法; 如文档中所示:

这些方法自动排除丢失/ 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 loop10000 loops, best of 3: 125 µs per loop
EdChum

1
@EdChum仅包含三个元素就不足为奇了;但是仅说100个元素就不是这种情况。
behzad.nouri 2014年

@ behzad.nouri我尝试了df1 ['comment'] = df1 ['comment']。str.lower(),但收到错误KeyError:'comment'everythime。我检查了-我有一个名为exaclty的列。什么会导致错误?
Katya

16

如果列不仅具有字符串而且具有数字,则另一种可能的解决方案是使用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)

1
谢啦!我忘记了NaN,我更正了答案
Mike W

7

可能的解决方案:

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

虽然不确定效率。


与其他答案相同,isinstance在检查对象类型时使用。
cs95,19年

6

你也可以试试这个

df= df.applymap(lambda s:s.lower() if type(s) == str else s)

1
type(s) == str应该改为isinstance(s, str)
cs95 '19

6

熊猫> = 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

另请参阅相关的GitHub问题GH25405

casefold适用于更具侵略性的案例折叠比较。它还可以优雅地处理NaN(与之类似str.lower)。

但是为什么这更好呢?

unicode可以看出差异。以python str.casefolddocs中的示例为例,

大小写折叠类似于小写字母,但更具攻击性,因为它旨在消除字符串中的所有大小写区别。例如,德语小写字母'ß'等效于"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()


2

可能正在使用列表理解

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)

2

应用lambda函数

df['original_category'] = df['original_category'].apply(lambda x:x.lower())


0

复制您的数据框列,然后简单地应用

df=data['x']
newdf=df.str.lower()
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.