Python:如何使用从列计算的多个字段扩展数据帧

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个额外列

我有一个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          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()
可能是非常干净和不错的解决方案!(在真实数据中,正则表达式更为复杂,但工作起来很有魅力)