如何基于另一DataFrame的属性列生成含指定字段的最终DataFrame?
问题描述
现有两个DataFrame:
df
| name | age | |
|---|---|---|
| 0 | Robert | 21 |
| 1 | Bob | 22 |
| 2 | Mike | 23 |
df2
| name | attribute | value | |
|---|---|---|---|
| 0 | Robert | robert@email.com | |
| 1 | Bob | bob@email.com | |
| 2 | Robert | married? | Yes |
| 3 | Mike | married? | No |
| 4 | Mike | employed? | Yes |
| 5 | Robert | have a car? | Yes |
| 6 | Bob | have a car? | No |
已知人员的所有属性包括:age、email、married?、employed?、have a car?、imigrant?、student?,需要生成目标DataFrame df_final:
df_final
| name | age | married? | employed? | have a car? | imigrant? | student? | ||
|---|---|---|---|---|---|---|---|---|
| 0 | Robert | 21 | robert@email.com | Yes | Yes | |||
| 1 | Bob | 22 | bob@email.com | No | ||||
| 2 | Mike | 23 | No | Yes |
曾尝试手动为df添加属性列,再使用df.loc[df['name']==df2['name'], df2['attribute']]插入对应值,但未成功。
解决方案
通过透视df2再与df合并的方式可以快速实现需求,步骤如下:
- 将
df2转为宽格式,把attribute的内容作为列名,value作为对应单元格的值:
df2_pivot = df2.pivot(index='name', columns='attribute', values='value').reset_index()
执行后会得到以name为标识、各属性为列的DataFrame,缺失的属性值默认填充NaN。
- 按
name列将df和透视后的df2_pivot左合并:
df_final = df.merge(df2_pivot, on='name', how='left')
- 补充缺失的属性列并调整列顺序,同时将
NaN替换为空字符串匹配目标格式:
# 定义所有需要的属性列 all_columns = ['name', 'age', 'email', 'married?', 'employed?', 'have a car?', 'imigrant?', 'student?'] # 重新排列列,缺失的列会自动添加 df_final = df_final.reindex(columns=all_columns) # 将NaN替换为空字符串 df_final = df_final.fillna('')
执行完以上代码后,就能得到与目标一致的df_final。
内容的提问来源于stack exchange,提问作者NicholasHenrique
相关产品推荐
相关产品推荐

