假设我们有一个系列,其中包含如下字符串:
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
吗?
答案 0 :(得分:3)
假设您在这里展示的是您所拥有的,即所有键值对都遵循该模式。 键+空格+ 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)