使用前缀重命名新的拆分列

Renaming new split columns with prefix

我有一个数据框,其中包含两列字典。

      type                              possession_team
0  {'id': 35, 'name': 'Starting XI'}  {'id':9101,'name':'San Diego Wave'}
1  {'id': 35, 'name': 'Starting XI'}  {'id':9101,'name':'San Diego Wave'}         
2  {'id': 18, 'name': 'Half Start'}   {'id':9101,'name':'San Diego Wave'}         
3  {'id': 18, 'name': 'Half Start'}   {'id':9101,'name':'San Diego Wave'}        
4  {'id': 30, 'name': 'Pass'}         {'id':9101,'name':'San Diego Wave'}

我用

pd.concat([df, df['type'].apply(pd.Series)], axis = 1).drop('type', axis = 1)

即时手动拆分列。我将如何使用此代码,同时向它创建的结果列添加前缀?前缀是它创建的结果列的前缀,所以我会有;

     type_id type_name                             
0     35    'Starting XI'
1     35    'Starting XI'         
2     18    'Half Start'        
3     18    'Half Start'   
4     30      'Pass'  

IIUC,假设有字典,你可以这样做:

df['type_id'] = df['type'].str['id']
df['type_name'] = df['type'].str['name']

更通用的方法:

for c in df['type'].explode().unique():
    df[f'type_{c}'] = df['type'].str[c]

甚至更通用(适用于所有列):

for col in ['type', 'possession_team']: # or df.columns
    for c in df[col].explode().unique():
        df[f'{col}_{c}'] = df[col].str[c]

输出:

                                type                         possession_team  \
0  {'id': 35, 'name': 'Starting XI'}  {'id': 9101, 'name': 'San Diego Wave'}   
1  {'id': 35, 'name': 'Starting XI'}  {'id': 9101, 'name': 'San Diego Wave'}   
2   {'id': 18, 'name': 'Half Start'}  {'id': 9101, 'name': 'San Diego Wave'}   
3   {'id': 18, 'name': 'Half Start'}  {'id': 9101, 'name': 'San Diego Wave'}   
4         {'id': 30, 'name': 'Pass'}  {'id': 9101, 'name': 'San Diego Wave'}   

   type_id    type_name  possession_team_id possession_team_name  
0       35  Starting XI                9101       San Diego Wave  
1       35  Starting XI                9101       San Diego Wave  
2       18   Half Start                9101       San Diego Wave  
3       18   Half Start                9101       San Diego Wave  
4       30         Pass                9101       San Diego Wave