将diff()应用于熊猫多索引级别?

时间:2019-08-12 13:36:11

标签: python pandas diff multi-index levels

我有一个数据框

                   A     B  
Date      Price    
2019-8-1  1000     1.1   0.0
          1500     2.3   2.2
          2200     4.5   0.5
          3100     4.4   0.9
2019-8-2  1100     2.2   1.2
          1400     2.5   1.3
          2200     0.9   1.6
          3500     1.1   0.1

我需要获取第三列'C',它将是multiindex中level = 1(价格)的diff():

                   A     B      C
Date      Price    
2019-8-1  1000     1.1   0.0    NaN
          1500     2.3   2.2    500
          2200     4.5   0.5    700
          3100     4.4   0.9    900
2019-8-2  1100     2.2   1.2    NaN
          1400     2.5   1.3    300
          2200     0.9   1.6    800
          3500     1.1   0.1   1300

我尝试使用groupby(level = 0),但是我不知道该如何将diff()应用于多索引级别。

谢谢。

1 个答案:

答案 0 :(得分:2)

使用Index.to_series创建新的MultiIndex Series,并用str[1]使元组的第二个值相乘,然后使用DataFrameGroupBy.diff

df['C'] = df.index.to_series().str[1].groupby(level=0).diff()

或用DataFrame.assignIndex.get_level_values创建新列:

df['C'] = df.assign(P=df.index.get_level_values(1)).groupby(level=0)['P'].diff()

print (df)
                  A    B       C
Date     Price                  
2019-8-1 1000   1.1  0.0     NaN
         1500   2.3  2.2   500.0
         2200   4.5  0.5   700.0
         3100   4.4  0.9   900.0
2019-8-2 1100   2.2  1.2     NaN
         1400   2.5  1.3   300.0
         2200   0.9  1.6   800.0
         3500   1.1  0.1  1300.0

详细信息

print (df.index.to_series())
Date      Price
2019-8-1  1000     (2019-8-1, 1000)
          1500     (2019-8-1, 1500)
          2200     (2019-8-1, 2200)
          3100     (2019-8-1, 3100)
2019-8-2  1100     (2019-8-2, 1100)
          1400     (2019-8-2, 1400)
          2200     (2019-8-2, 2200)
          3500     (2019-8-2, 3500)

print (df.index.to_series().str[1])
Date      Price
2019-8-1  1000     1000
          1500     1500
          2200     2200
          3100     3100
2019-8-2  1100     1100
          1400     1400
          2200     2200
          3500     3500
dtype: int64

print (df.assign(P=df.index.get_level_values(1)))
                  A    B     P
Date     Price                
2019-8-1 1000   1.1  0.0  1000
         1500   2.3  2.2  1500
         2200   4.5  0.5  2200
         3100   4.4  0.9  3100
2019-8-2 1100   2.2  1.2  1100
         1400   2.5  1.3  1400
         2200   0.9  1.6  2200
         3500   1.1  0.1  3500

编辑:

comments的另一种解决方案:

df.index.to_frame().groupby(level=0)['Price'].diff()