仅对带有 Pandas 的字符串列应用转换,忽略数字数据

Posted

技术标签:

【中文标题】仅对带有 Pandas 的字符串列应用转换,忽略数字数据【英文标题】:Apply transformation only on string columns with Pandas, ignoring numeric data 【发布时间】:2021-01-30 02:52:54 【问题描述】:

所以,我有一个相当大的数据框,有 85 列和近 90,000 行,我想在所有数据框中都使用 str.lower()。但是,有几列包含数字数据。有没有简单的解决方案?

> df

    A   B   C
0   10  John    Dog
1   12  Jack    Cat
2   54  Mary    Monkey
3   23  Bob     Horse

然后,在使用类似 df.applymap(str.lower) 之后,我会得到:

> df

    A   B   C
0   10  john    dog
1   12  jack    cat
2   54  mary    monkey
3   23  bob     horse

目前它正在显示此错误消息:

TypeError: descriptor 'lower' requires a 'str' object but received a 'int'

【问题讨论】:

【参考方案1】:

df.apply(lambda x:[x.str.lower() if x.dtypes==object else x])

【讨论】:

【参考方案2】:

从 pandas 1.X 开始,您可以使用 select_dtypes("string") 有效地选择纯字符串列:

string_dtypes = df.convert_dtypes().select_dtypes("string")
df[string_dtypes.columns] = string_dtypes.apply(lambda x: x.str.lower())

df
    A     B       C
0  10  john     dog
1  12  jack     cat
2  54  mary  monkey
3  23   bob   horse

df.dtypes

A     int64
B    string
C    string
dtype: object

这样可以避免对非字符串数据进行操作。

【讨论】:

为了提高效率,我倾向于只为 select_dtypes 使用 1 行,例如:df.convert_dtypes().head(1).select_dtypes("string") @Erfan 是的,如果您只使用 select_dtypes 选择列名,然后在 df[selected_types.columns]. In this case I'm applying str.lower on selected_dtypes` 上调用 apply,那就可以了不要那样做,但很好的标注。【参考方案3】:

当然,首先使用 select_dtypes("object") 选择您的 str 列:

df[df.select_dtypes("object").columns].applymap(str.lower)

【讨论】:

以上是关于仅对带有 Pandas 的字符串列应用转换,忽略数字数据的主要内容,如果未能解决你的问题,请参考以下文章

从 Pandas DF 的字符串列中提取数字

从不在任何其他数字之前或之后的pandas字符串列中提取最多N位数

将日期时间列转换为字符串列

将带有日期和时间信息的字符串列转换为R [duplicate]中的datetime类型

如何将 NULL 视为带有 pandas 的普通字符串?

执行时忽略字符串列