如何在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?
解决方法
核心思路是统一变化值的列名与原数据一致,修改变化数据的索引为△+币种名,再将两个数据集按行拼接:
- 处理
change_of_greeks_df:移除列名的△前缀,让列名和summary_df对齐 - 修改变化数据的索引,给原币种名前加上
△标记 - 拼接两个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
相关产品推荐
相关产品推荐

