通过正则表达式选择列来更改 Pandas 列的数据类型

Posted

技术标签:

【中文标题】通过正则表达式选择列来更改 Pandas 列的数据类型【英文标题】:Change DataTypes of Pandas Columns by selecting columns by regex 【发布时间】:2020-11-10 17:13:43 【问题描述】:

我有一个 Pandas 数据框,其中有很多列看起来像 p_d_d_c0、p_d_d_c1、... p_d_d_g1、p_d_d_g2、...

  df = 
        a     b     c      p_d_d_c0     p_d_d_c1    p_d_d_c2 ... p_d_d_g0  p_d_d_g1 ...

需要选择所有这些与正则表达式确认的列,并且需要将它们的数据类型从对象更改为浮点数。特别是,列看起来像 p_d_d_c* 和 p_d_d_g* 它们都是 object 类型,我想将它们更改为 float 类型。有没有办法通过使用正则表达式批量选择列并将它们更改为浮点类型?

我尝试了here 的答案,但由于我有数百个这样的列,这需要大量时间和内存。

    df[df.filter(regex=("p_d_d_.*"))

我也试过了:

    df.select(lambda col: col.startswith('p_d_d_g'), axis=1)

但是,它给出了一个错误:

    AttributeError: 'DataFrame' object has no attribute 'select'

我的熊猫版本是1.0.1

那么,如何批量选择列并使用正则表达式更改其数据类型?

【问题讨论】:

您能简要解释一下您要做什么吗?您将字符转换为浮点值的规则是什么? 您是否要选择符合某个正则表达式的列?或者您是否正在尝试将包含对象数据(字符)的系列转换为浮点数? 我正在尝试选择符合某个正则表达式的列,并将所有这些选定的列从 object 类型更改为 float 类型 知道了。请参阅下面的解决方案, 【参考方案1】:

试试这个:

import pandas as pd

# sample dataframe
df = pd.DataFrame(data="co1":[1,2,3,4], "co22":[4,3,2,1], "co3":[2,3,2,4], "abc":[5,4,3,2])

# select all columns which have co in it
floatcols = [col for col in df.columns if "co" in col]

for floatcol in floatcols:
    df[floatcol] = df[floatcol].astype(float)

【讨论】:

有没有办法加快这个速度?特别符合astype?【参考方案2】:

来自同一个链接,并带有一些 astype 魔法。

column_vals = df.columns.map(lambda x: x.startswith("p_d_d_"))
train_temp = df.loc(axis=1)[column_vals]
train_temp = train_temp.astype(float)

编辑:

要修改原始数据框,请执行以下操作:

column_vals = [x for x in df.columns if x.startswith("p_d_d_")]
df[column_vals] = df[column_vals].astype(float)

【讨论】:

嗨@apurvmishra99,它不会改变原始数据框。我错误地添加了 train_temp。只有一个数据框df

以上是关于通过正则表达式选择列来更改 Pandas 列的数据类型的主要内容,如果未能解决你的问题,请参考以下文章

pandas使用extract函数根据正则表达式从dataframe指定数据列的字符串中抽取出数字(设置expand=false之后返回的为series)将series转化为dataframe

Pandas使用split函数基于指定分隔符拆分数据列的内容为列表设置expand参数将拆分结果列表内容转化为多列数据并添加到原数据中replace函数基于正则表达式替换字符串数据列中的匹配内容

Pandas:更改通过列中的布尔索引选择的值而不会收到警告

用正则表达式替换 Pandas 数据框中字符串的某个部分

通过使用 HDFStore 比较列来选择行

在 pandas 0.16+ 中,如何使用变量添加列来指示列名?