如何使用正则表达式从熊猫数据框中的一行中的字符串中提取所有特定值?

Posted

技术标签:

【中文标题】如何使用正则表达式从熊猫数据框中的一行中的字符串中提取所有特定值?【英文标题】:How to extract all specific values from a string in a row in pandas dataframe with regex? 【发布时间】:2022-01-20 13:24:59 【问题描述】:

我在 Dataframe 行的字符串中有特定的值,这完全是一团糟。这些是按以下格式抓取的评论分数:

 data = 'split': ['5,   60% 4,   20% 3,   7% 2,   5% 1,   7% 4.2 out of 5']
 df = pd.DataFrame(data)

我需要这种格式,这意味着我必须将上面的长字符串拆分为这些列和相应的值。每个等级 (1-5) 应分配相应的百分比。

 data = '5': ['60%'], '4': ['20%'],  '3': ['7%'],  '2': ['5%'], '1': ['7%'], 'rating': [4.2]
 df = pd.DataFrame(data)

起初我在考虑df['split'].str.extract(pat = '(\d+%)') 以提取所有带有 % 的数字,但实际上并没有用。它只提取带有 % 的第一个数字,而不是全部从字符串中提取。任何想法如何进行?

【问题讨论】:

你说的“没用”是什么意思?使用data = 'split': ['5', '60% 4', '20% 3', '7% 2', '5% 1', '7% 4.2 out of 5'],然后使用df['split'].str.extract(pat = '(\d+%)'),它似乎可以工作。 data['split'] 肯定是错误的,因为它获取的是一个字符串,而不是一个系列(所以它没有 .str 属性)。 Olu,你看到“AttributeError: 'list' object has no attribute 'str'”错误信息对吗? @WiktorStribiżew 我更正了问题以使其更清楚:),谢谢 完美运行,谢谢! 【参考方案1】:

你可以使用

import pandas as pd
data = 'split': ['5,   60% 4,   20% 3,   7% 2,   5% 1,   7% 4.2 out of 5', '15,   20% 4,   40% 3,   5% 2,   2% 1,   37% 3.2 out of 5']
df = pd.DataFrame(data)
df_out = df['split'].str.extractall(r'(\d+%)')[0].unstack().reset_index(level=0, drop=True)
df_out['rating'] = df['split'].str.extract(r'(\d*\.?\d+)\s+out\s+of\b', expand=False)

输出:

>>> df_out
match    0    1   2   3    4 rating
0      60%  20%  7%  5%   7%    4.2
1      20%  40%  5%  2%  37%    3.2

注意事项:

df['split'].str.extractall(r'(\d+%)')[0].unstack().reset_index(level=0, drop=True) 提取所有 \d+% 匹配项并将结果放入具有未堆叠值和重置索引的数据帧中 df['split'].str.extract(r'(\d*\.?\d+)\s+out\s+of\b', expand=False) 提取 out of 子字符串之前的整数或浮点数。

【讨论】:

以上是关于如何使用正则表达式从熊猫数据框中的一行中的字符串中提取所有特定值?的主要内容,如果未能解决你的问题,请参考以下文章

从熊猫数据框中的地址中删除分数

如何从熊猫数据框中的当前行中减去前一行并将其应用于每一行;不使用循环?

从熊猫数据框中仅提取数字和字符串

在熊猫数据框中使用正则表达式替换列值

使用正则表达式从 pandas 数据框中提取元素

列值不在熊猫数据框中的索引中