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

如何在Pandas中调整DataFrame结构以实现指定格式输出

问题

我通过两个字典创建了如下DataFrame:

import pandas as pd
summary={'BTC': {'DAE': -11661300, 'Vega': -661, 'Theta': 109, 'Gamma': -32391},
 'ETH': {'DAE': -533985, 'Vega': -227, 'Theta': 518, 'Gamma': -289779}}
summary_df = pd.DataFrame.from_dict(summary)
summary_df = summary_df.transpose()
display(summary_df)

greeks_6_pm= {'BTC': {'DAE': -11725765, 'Vega': -567, 'Theta': 79, 'Gamma': 85512},
 'ETH': {'DAE': -676607, 'Vega': -15, 'Theta': 186, 'Gamma': -78159}}

change_of_greeks_df = pd.DataFrame(summary).sub(pd.DataFrame(greeks_6_pm)).transpose().add_prefix("△")
pnl_summary = pd.merge(summary_df, change_of_greeks_df, left_index=True, right_index=True)

当前输出为:

DAE         Vega    Theta   Gamma   △DAE    △Vega   △Theta  △Gamma
BTC -11661300   -661    109    -32391   64465   -94      30    -117903
ETH -533985    -227     518   -289779   142622  -212    332     -211620

但我需要的目标输出是:

Currency     DAE      Vega    Theta   Gamma
BTC     -11661300   -661    109    -32391
△BTC       64465     -94     30    -117903         
ETH      -533985    -227    518   -289779           
△ETH      142622    -212    332   -211620     

我尝试使用以下代码:

pnl_summary = pd.concat([summary_df, change_of_greeks_df], axis=0, keys=['', 'Changed']).swaplevel(axis=0)
display(pnl_summary)

得到的输出不符合预期:

DAE       Vega  Theta    Gamma  △DAE    △Vega  △Theta  △Gamma
BTC   -11661300     -661    109   -32391    NaN      NaN      NaN      NaN
ETH    -533985      -227    518  -289779    NaN      NaN      NaN      NaN
BTC Changed      NaN      NaN    NaN      NaN  64465      -94      30  -117903
ETH Changed      NaN      NaN    NaN      NaN  142622    -212    332  -211620

请问如何调整才能得到目标格式的DataFrame?

解决方法

核心思路是统一变化值的列名与原数据一致,修改变化数据的索引为△+币种名,再将两个数据集按行拼接:

  1. 处理change_of_greeks_df:移除列名的△前缀,让列名和summary_df对齐
  2. 修改变化数据的索引,给原币种名前加上△标记
  3. 拼接两个DataFrame,按币种名排序后重置索引并命名为Currency

具体代码如下:

import pandas as pd

# 原数据定义
summary={'BTC': {'DAE': -11661300, 'Vega': -661, 'Theta': 109, 'Gamma': -32391},
 'ETH': {'DAE': -533985, 'Vega': -227, 'Theta': 518, 'Gamma': -289779}}
summary_df = pd.DataFrame.from_dict(summary).transpose()

greeks_6_pm= {'BTC': {'DAE': -11725765, 'Vega': -567, 'Theta': 79, 'Gamma': 85512},
 'ETH': {'DAE': -676607, 'Vega': -15, 'Theta': 186, 'Gamma': -78159}}

# 计算变化值并处理格式
change_of_greeks_df = pd.DataFrame(summary).sub(pd.DataFrame(greeks_6_pm)).transpose().add_prefix("△")
# 移除列名的△前缀,和原数据列名统一
change_of_greeks_df.columns = change_of_greeks_df.columns.str.lstrip("△")
# 修改索引为△+原币种名
change_of_greeks_df.index = "△" + change_of_greeks_df.index

# 拼接两个数据集,按币种名排序(去掉△后排序)
result = pd.concat([summary_df, change_of_greeks_df]).sort_index(key=lambda x: x.str.strip("△"))
# 重置索引并命名为Currency列
result = result.reset_index().rename(columns={'index': 'Currency'})

display(result)

运行后输出与目标格式一致:

Currency       DAE  Vega  Theta    Gamma
0      BTC -11661300  -661    109   -32391
1     △BTC    64465   -94     30  -117903
2      ETH   -533985  -227    518  -289779
3     △ETH   142622  -212    332  -211620

内容的提问来源于stack exchange,提问作者Madan Raj

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.05 16:07:47