You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python Pandas:如何简洁可读地将DataFrame A转换为指定DataFrame B?

Pandas简洁实现DataFrame A到B的转换

需要将如下的DataFrame A转换为DataFrame B,原方案通过groupby聚合加自定义函数拆分,步骤繁琐,寻求更简洁可读性强的实现方式:

DataFrame A:

keystreamsaccidental
0A2.33349Major
1A#3.0565Minor
2B2.52871Major
3C#3.02007Minor
4D2.76289Major
5D#2.57981Minor
6E2.53651Major
7F2.48089Major
8F#2.58316Minor
9G2.44892Major
10G#2.7892Minor

DataFrame B:

keymajor_streamsminor_streams
A2.333493.0565
B2.52871nan
Cnan3.02007
D2.762892.57981
E2.53651nan
F2.480892.58316
G2.448922.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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.08 15:14:57