python - Pandas str.extract 从字符串字段检索字典

标签 python string pandas

假设我们有一个系列,其中包含如下字符串:

0                         FOO
1                         NaN
2                     FOO x 9
3                         NaN
4                         NaN
5                     FOO x 2
6                         NaN
7                         NaN
8          BAR x 2, BAZ  x 11
9                         NaN

我希望将其转换为数据框,这样我们最终会得到:

    FOO   BAR   BAZ
0     1     0     0
1     0     0     0
2     9     0     0
3     0     0     0
4     0     0     0
5     2     0     0
6     0     0     0
7     0     0     0
8     0     2    11
9     0     0     0

我们可以假设我们知道“键”列表(先验FOOBARBAZ)。

这可以用str.extract实现吗?

最佳答案

假设您在这里显示的就是您所拥有的,即所有键值对都遵循该模式。 键 + 空格 + x + 空格 + 值,您可以使用 (?P<key>\w+)(?:\s+x\s+(?P<value>\d+))?捕捉它。对此进行分解:

  • (?P<key>\w+)捕获命名组 key它由单词字符组成,即 [0-9A-Za-z_]如果情况并非如此,请调整此设置;
  • (?:\s+x\s+(?P<value>\d+))?捕获一个可选组,如果值为 1,则该组将丢失;
  • \s+x\s+捕获将在结果中被忽略的分割字符串;
  • (?P<value>\d+)捕获另一个命名组 value由数字组成;

extractall结合在一起如果有多个匹配项(如第 8 行的情况),则生成多行:

df1 = (df[1].str.extractall("(?P<key>\w+)(?:\s+x\s+(?P<value>\d+))?")
            .fillna(1).reset_index(level=1, drop=True))
df1

enter image description here

df1提取所有键值对后给出一个缩减的数据集,要将其转换为您需要的格式,您可以将键列拆开以使其成为列标题,并使用原始数据框的索引对其重新索引:

df1.set_index('key', append=True).value.unstack(level=1).reindex(df.index).fillna(0)

enter image description here

关于python - Pandas str.extract 从字符串字段检索字典,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41840554/

相关文章:

python - 在 Python 中存储应用程序设置

python - 如何在通过 SSO 凭证连接时使用 AWS Python SDK

python - Halide 与 C 布局 numpy 数组

在C中将64位unsigned int来回转换为char缓冲区

python - 将一列数据帧行中的列表转换为简单字符串

python - 重新加载与重新启动 uWSGI 以激活代码更改

c++ - 为什么这个版本的 strcmp 比较慢?

python - 使用正则表达式python对字符串中的数字进行多次替换

python - 将两列 Pandas 列表彼此分开

python - 在 Pandas 中给SparseArray赋值吗?