如何从python中所有列的字符串中提取数字

2024-09-28 21:52:08 发布

您现在位置:Python中文网/ 问答频道 /正文

使用str.extract()从字符串中提取数字是可行的(见下文),但当我必须在30多个列上重复此操作时,这很耗时

原来是这样的:

yyyy
2014    110.7438016528926\K
2015    103.7533512064343\O
2016    111.6531165311653\L
2017                  nan\L
2018                  nan\E
Name: dips_cert_earning_premium_weekly, dtype: object

然后我写了这些代码:

df['dips_cert_earning_premium_weekly'] = df['dips_cert_earning_premium_weekly'].str.extract(r'(\d+(?:\.\d+)?)').astype(float)

输出:

yyyy
2014    110.743802
2015    103.753351
2016    111.653117
2017           NaN
2018           NaN
Name: dips_cert_earning_premium_weekly, dtype: float64

有没有更有效的方法


Tags: 字符串namedfcertextract数字nandtype
1条回答
网友
1楼 · 发布于 2024-09-28 21:52:08

我不确定你的整个数据集是什么样子,也不确定你所说的慢是什么意思:这需要几分钟吗?秒?小时?。但是,如果可能的话,您可以尝试一种不使用regexp的方法。例如:

letters = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ\\"
def remove_letters(x):
    try:
        return float(x.strip(letters))
    except:
        return None

df['dips_cert_earning_premium_weekly'] = list(map(remove_letters,  df['dips_cert_earning_premium_weekly']))

如果数据集只有一列31行,那么您的版本需要0.0008417534828186036秒,而我建议的版本需要0.0003292644023895264秒,所以这是一个细微的差别,但值得尝试。(我通过计算N=1000次的运行时间来计算该时间,然后取所有时间的平均值)

否则,请尝试分析代码以查看瓶颈所在,并尝试不同的实现,直到找到最快的实现

编辑:

要使用新数据完全回答问题:要迭代数据帧并将其应用于每列,可以尝试以下代码:

df = pd.DataFrame.from_dict(data)
for (columnName, columnData) in df.iteritems():
   df[columnName] = list(map(remove_letters,  df[columnName])) # This is the same line from before. Only difference is that we are applying it to all columns.

相关问题 更多 >