Python:如何使用从列计算的多个字段扩展数据帧
我有一个datadrame,看起来像:Python:如何使用从列计算的多个字段扩展数据帧,python,pandas,Python,Pandas,我有一个datadrame,看起来像: A B 0 2.0 'C=4;D=5;' 1 2.0 'C=4;D=5;' 2 2.0 'C=4;D=5;' {C: 4, D: 5} 我可以解析B列中的字符串,比如使用函数名parse_col(),将其解析为一个dict,如下所示: A B 0 2.0 'C=4;D=5;' 1 2.0 'C=4;D=5;' 2 2.0 'C=4;D=5;' {C: 4, D: 5} 如何将2个额外列
A B
0 2.0 'C=4;D=5;'
1 2.0 'C=4;D=5;'
2 2.0 'C=4;D=5;'
{C: 4, D: 5}
我可以解析B列中的字符串,比如使用函数名parse_col()
,将其解析为一个dict,如下所示:
A B
0 2.0 'C=4;D=5;'
1 2.0 'C=4;D=5;'
2 2.0 'C=4;D=5;'
{C: 4, D: 5}
如何将2个额外列添加到数据框中,使其看起来像:
A B C D
0 2.0 'C=4;D=5;' 4 5
1 2.0 'C=4;D=5;' 4 5
2 2.0 'C=4;D=5;' 4 5
我只能选择特定的列,解析并添加它,但这显然不是最好的方法。我还尝试在
pandas
中使用该示例的一个变体,但我无法使其仅在特定列上工作。我们可以使用Series.str.extractall
,然后使用unstack
将行链接到列:
df[['C', 'D']] = df['B'].str.extractall('(\d+)').unstack()
A B C D
0 2.0 'C=4;D=5;' 4 5
1 2.0 'C=4;D=5;' 4 5
2 2.0 'C=4;D=5;' 4 5
您可以使用和,这样您就可以直接读取列名:
>>> from functools import reduce
>>> reduce(
lambda x,y: x.eval(y),
df.B.str
.extractall(r'([A-Za-z]=\d+)')
.unstack().xs(0), df
)
A B C D
0 2.0 'C=4;D=5;' 4 5
1 2.0 'C=4;D=5;' 4 5
2 2.0 'C=4;D=5;' 4 5
您可以使用命名聚合来提取列名及其关联的值。然后重塑形状并重新连接
df1 = (df['B'].str.extractall(r'(?P<col>[A-Za-z]+)=(?P<val>\d+);')
.reset_index(1, drop=True)
.pivot(columns='col', values='val'))
pd.concat([df, df1], axis=1)
A B C D
0 2.0 C=4;D=5; 4 5
1 2.0 C=4;D=5; 4 5
2 2.0 C=4;D=5; 4 5
分享你的代码?它看起来像是
.explode().pivot()
可能是非常干净和不错的解决方案!(在真实数据中,正则表达式更为复杂,但工作起来很有魅力)