Python Pandas:如何简洁可读地将DataFrame A转换为指定DataFrame B?
Pandas简洁实现DataFrame A到B的转换
需要将如下的DataFrame A转换为DataFrame B,原方案通过groupby聚合加自定义函数拆分,步骤繁琐,寻求更简洁可读性强的实现方式:
DataFrame A:
| key | streams | accidental | |
|---|---|---|---|
| 0 | A | 2.33349 | Major |
| 1 | A# | 3.0565 | Minor |
| 2 | B | 2.52871 | Major |
| 3 | C# | 3.02007 | Minor |
| 4 | D | 2.76289 | Major |
| 5 | D# | 2.57981 | Minor |
| 6 | E | 2.53651 | Major |
| 7 | F | 2.48089 | Major |
| 8 | F# | 2.58316 | Minor |
| 9 | G | 2.44892 | Major |
| 10 | G# | 2.7892 | Minor |
DataFrame B:
| key | major_streams | minor_streams |
|---|---|---|
| A | 2.33349 | 3.0565 |
| B | 2.52871 | nan |
| C | nan | 3.02007 |
| D | 2.76289 | 2.57981 |
| E | 2.53651 | nan |
| F | 2.48089 | 2.58316 |
| G | 2.44892 | 2.7892 |
最优实现方案
利用Pandas的pivot函数可以一步完成数据重塑,配合简单的字符串处理即可实现需求,无需自定义辅助函数:
import pandas as pd # 假设原始数据存储在df变量中 # 1. 处理key列,移除#得到基础调名 df['base_key'] = df['key'].str.replace('#', '') # 2. 使用pivot重塑数据,自动拆分Major/Minor到对应列 result = df.pivot(index='base_key', columns='accidental', values='streams') # 3. 调整列名与索引顺序,匹配目标DataFrame B的格式 result = result.rename(columns={'Major': 'major_streams', 'Minor': 'minor_streams'}) # 按A/B/C/D/E/F/G的顺序排序索引 result = result.reindex(['A', 'B', 'C', 'D', 'E', 'F', 'G']) # 4. 重置索引,将base_key转为普通列 result = result.reset_index().rename(columns={'base_key': 'key'})
代码说明
- key列处理:用
str.replace移除所有#符号,将A#、C#等映射为对应的基础调名,实现同调名的Major/Minor数据分组。 - pivot函数:指定分组索引为处理后的基础调名,列维度为
accidental(Major/Minor),值为streams,自动将同组数据拆分到对应列,缺失数据自动填充NaN。 - 格式调整:重命名列名匹配需求,按指定顺序排序索引,确保输出结构与DataFrame B完全一致。
内容的提问来源于stack exchange,提问作者Jay Nguyen
相关产品推荐
相关产品推荐

