仅当列值为字符串时才将列值转换为小写

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)

yse*_*rka 8

你的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)


cs9*_*s95 5

这些列的开头是什么类型?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现在。