作为图片,我有一个名为"overall_zx"[78]
的多索引数据框。
YTD2017/YTD2018/YTD2019
的销售量和销售量。现在,我要计算价格(销售量除以YTD
。我找到了将价格计算为[79]
的方法,但是我不知道如何在此表的overall_zx
中将其合并。
否则,有什么方法可以直接分割它们?就像单层结构数据框一样例如:
df['price'] = df['sales'] / df['volumns']
((在multi-index
中,此代码无效)
为了测试,我使用了以下DataFrame(使用拉丁字符作为列名和索引):
Volume Sale
YTD2017 YTD2018 YTD2019 YTD2017 YTD2018 YTD2019
A 212.0 220.0 226.16 3654.04 4163.87 4695.12
B 17.5 18.5 18.57 234.84 274.47 298.90
C 18.5 14.5 12.66 213.02 191.14 177.46
我的第一个观察结果是,仅df.Sale / df.Volume
单独[[确实有效,因此,将结果保存在辅助DataFrame(df2)中。到目前为止,我们有:
YTD2017 YTD2018 YTD2019
A 17.236038 18.926682 20.760170
B 13.419429 14.836216 16.095854
C 11.514595 13.182069 14.017378
此结果不能与原始连接,因为df具有一个MultiIndex作为列,而df2具有“普通”索引。但是我们可以df
add将缺少的索引级别添加到df2
中的列:df2.columns = pd.MultiIndex.from_product([['Price'], df2.columns])
现在在列上还包含MultiIndex:df2
Price
YTD2017 YTD2018 YTD2019
A 17.236038 18.926682 20.760170
B 13.419429 14.836216 16.095854
C 11.514595 13.182069 14.017378
所以现在加入这两个DataFrame没有障碍:
df = df.join(df2)
获取:
Volume Sale Price YTD2017 YTD2018 YTD2019 YTD2017 YTD2018 YTD2019 YTD2017 YTD2018 YTD2019 A 212.0 220.0 226.16 3654.04 4163.87 4695.12 17.236038 18.926682 20.760170 B 17.5 18.5 18.57 234.84 274.47 298.90 13.419429 14.836216 16.095854 C 18.5 14.5 12.66 213.02 191.14 177.46 11.514595 13.182069 14.017378
DataFrame.join
和DataFrame.join
加倍选择相同的新名称来使用新的MultIndex
DataFrame,在此处使用[]
:rename
[另一个由price
重塑的想法df1 = (df.join(df[['sales']].rename(columns={'sales':'price'}) / df[['volumns']].rename(columns={'volumns':'price'})))
:对于新列,将
DataFrame.stack
用于一种行解决方案:
DataFrame.stack
此替代项有什么相同之处:
从@Valdi_Bo借用数据:
DataFrame.unstack