假设我们有一个系列,其中包含如下字符串:
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
我们可以假设我们知道“键”列表(先验FOO
、BAR
和BAZ
)。
这可以用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
df1
提取所有键值对后给出一个缩减的数据集,要将其转换为您需要的格式,您可以将键列拆开以使其成为列标题,并使用原始数据框的索引对其重新索引:
df1.set_index('key', append=True).value.unstack(level=1).reindex(df.index).fillna(0)
关于python - Pandas str.extract 从字符串字段检索字典,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41840554/