use*_*331 6 python string dataframe pandas
我在将列转换为小写时遇到了麻烦.它并不像以下那样简单:
df['my_col'] = df['my_col'].str.lower()
Run Code Online (Sandbox Code Playgroud)
因为我正在迭代很多数据帧,其中一些(但不是全部)在感兴趣的列中都有字符串和整数.如果像上面那样应用,这会导致较低的函数抛出异常:
AttributeError: Can only use .str accessor with string values, which use np.object_ dtype in pandas
Run Code Online (Sandbox Code Playgroud)
我不想强迫类型成为字符串,而是评估值是否为字符串,然后 - 如果是 - 将它们转换为小写,并且 - 如果它们不是字符串 - 将它们保持原样.我认为这会奏效:
df = df.apply(lambda x: x.lower() if(isinstance(x, str)) else x)
Run Code Online (Sandbox Code Playgroud)
但它不起作用......可能是因为我忽略了一些明显的东西,但我看不出它是什么!
我的数据看起来像这样:
OS Count
0 Microsoft Windows 3
1 Mac OS X 4
2 Linux 234
3 Don't have a preference 0
4 I prefer Windows and Unix 3
5 Unix 2
6 VMS 1
7 DOS or ZX Spectrum 2
Run Code Online (Sandbox Code Playgroud)
你的lambda函数中的测试不太正确,但你离真相并不远:
df.apply(lambda x: x.str.lower() if(x.dtype == 'object') else x)
Run Code Online (Sandbox Code Playgroud)
使用数据框和输出:
>>> df = pd.DataFrame(
[
{'OS': 'Microsoft Windows', 'Count': 3},
{'OS': 'Mac OS X', 'Count': 4},
{'OS': 'Linux', 'Count': 234},
{'OS': 'Dont have a preference', 'Count': 0},
{'OS': 'I prefer Windows and Unix', 'Count': 3},
{'OS': 'Unix', 'Count': 2},
{'OS': 'VMS', 'Count': 1},
{'OS': 'DOS or ZX Spectrum', 'Count': 2},
]
)
>>> df = df.apply(lambda x: x.str.lower() if x.dtype=='object' else x)
>>> print(df)
OS Count
0 microsoft windows 3
1 mac os x 4
2 linux 234
3 dont have a preference 0
4 i prefer windows and unix 3
5 unix 2
6 vms 1
7 dos or zx spectrum 2
Run Code Online (Sandbox Code Playgroud)
这些列的开头是什么类型?object?如果是这样,您应该只将它们转换:
df['my_col'] = df.my_col.astype(str).str.lower()
Run Code Online (Sandbox Code Playgroud)
MVCE:
In [1120]: df
Out[1120]:
Col1
0 VIM
1 Foo
2 test
3 1
4 2
5 3
6 4.5
7 OSX
In [1121]: df.astype(str).Col1.str.lower()
Out[1121]:
0 vim
1 foo
2 test
3 1
4 2
5 3
6 4.5
7 osx
Name: Col1, dtype: object
In [1118]: df.astype(str).Col1.str.lower().dtype
Out[1118]: dtype('O')
Run Code Online (Sandbox Code Playgroud)
如果要对这些行进行算术运算,则可能不应混用strs和数字类型。
但是,如果确实如此,则可以使用pd.to_numeric(..., errors='coerce'):
In [1123]: pd.to_numeric(df.Col1, errors='coerce')
Out[1123]:
0 NaN
1 NaN
2 NaN
3 1.0
4 2.0
5 3.0
6 4.5
7 NaN
Name: Col1, dtype: float64
Run Code Online (Sandbox Code Playgroud)
您可以使用NaN,但请注意dtype现在。