python - 如何从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
有没有更有效的方法来做到这一点?
解决方案
我不确定你的整个数据集是什么样子的,或者你说的慢是什么意思:需要几分钟吗?秒?小时?。但是,如果可能的话,您可以尝试不使用正则表达式的方法。例如:
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.
推荐阅读
- python - Pandas 根据列条件拆分行
- oracle - oracle 10g ora-04030 - 是否有查询“导致内存不足的查询”?
- c# - 如何找出 GetBackBufferData 的参数应该是什么大小?
- python-3.x - 仅从具有 Python 中某些关键字的 txt 文件中的特定行中提取数字
- cassandra - cassnadra 多/单分区批处理说明
- c# - C# Windows 桌面窗体应用程序中的 Delphi“提示”等价物是什么?
- c++ - 无法显示最后一个数组
- dbvisualizer - 直接在 SQL 代码中设置 dbVisualizer Pro 的值
- rust - 无法修改递归结构中的字段
- java - Thymeleaf 无法在 Spring Boot 项目中找到模板