如图所示,我有一个名为"overall_zx"[78]的多索引数据。
YTD2017/YTD2018/YTD2019有销量和容量。现在我要计算价格(销售额除以单个YTD)。我找到了用[79]来计算价格的方法,但是我不知道如何在overall_zx中组合这个表。
否则,有没有办法直接把它们分开呢?就像单元组的数据格式。例如:
df['price'] = df['sales'] / df['volumns'] (在multi-index中,此代码不起作用)

发布于 2019-11-30 06:52:08
您可以将DataFrame.join与新的MultIndex DataFrame一起使用,方法是选择by double []和rename以相同的新名称,此处为price。
df1 = (df.join(df[['sales']].rename(columns={'sales':'price'}) /
df[['volumns']].rename(columns={'volumns':'price'})))由DataFrame.stack和DataFrame.unstack重塑的另一个想法
对于新列,请将DataFrame.assign用于一行解决方案:
df1 = df.stack().assign(price = lambda x: x['sales'] / x['volumns']).unstack()与此类似的是:
df1 = df.stack()
df1['price'] = df1['sales'] / df1['volumns']
df1 = df1.unstack()数据借用自@Valdi_Bo:
print (df1)
volumns sales price \
YTD2017 YTD2018 YTD2019 YTD2017 YTD2018 YTD2019 YTD2017 YTD2018
A 212.0 220.0 226.16 3654.04 4163.87 4695.12 17.236038 18.926682
B 17.5 18.5 18.57 234.84 274.47 298.90 13.419429 14.836216
C 18.5 14.5 12.66 213.02 191.14 177.46 11.514595 13.182069
YTD2019
A 20.760170
B 16.095854
C 14.017378 发布于 2019-11-30 06:09:10
在我的测试中,我使用了以下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,因为df有一个MultiIndex作为列,而df2有一个“普通”索引。
但是我们可以将缺少的索引级别添加到df2中的列中
df2.columns = pd.MultiIndex.from_product([['Price'], df2.columns])现在,df2还包含列上的MultiIndex:
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因此,现在加入这2 DataFrames没有任何障碍:
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 https://stackoverflow.com/questions/59113241
复制相似问题