多索引数据框架中数据的划分

2024-03-29 10:37:18 发布

您现在位置:Python中文网/ 问答频道 /正文

如图所示,我有一个名为"overall_zx"[78]的多索引数据帧。你知道吗

YTD2017/YTD2018/YTD2019的销售额和销售量。现在我要计算价格(销售额除以单个YTD)。我找到了将价格计算为[79]的方法,但是我不知道如何将它组合到overall_zx这个表中。你知道吗

否则,有没有什么办法可以直接把他们分开?就像单层次数据帧一样。例如:

df['price']  = df['sales'] / df['volumns'] 

(在multi-index中,此代码不起作用)

Dataframe


Tags: 数据方法df价格pricesaleszx办法
2条回答

在我的测试中,我使用了以下数据帧(使用拉丁字符 作为列名和索引):

   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单独起作用, 因此,让我们将结果保存在一个辅助数据帧(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具有 多索引作为列,而df2有一个“普通”索引。你知道吗

但是我们可以将缺少的索引级别添加到df2中的列中:

df2.columns = pd.MultiIndex.from_product([['Price'], df2.columns])

现在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

所以现在加入这两个数据帧没有任何障碍:

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 

您可以将^{}与新的MultIndex数据帧一起使用,方法是对相同的新名称进行双[]rename选择,这里price

df1  = (df.join(df[['sales']].rename(columns={'sales':'price'}) / 
                df[['volumns']].rename(columns={'volumns':'price'})))

另一个想法是通过^{}^{}

对于新列,请使用^{}作为单行解决方案:

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èu 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  

相关问题 更多 >