python - 将 diff() 应用于 pandas 多索引级别?

标签 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”,它将是多索引中 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() 应用于多索引级别。

谢谢。

最佳答案

使用Index.to_series创建新的MultiIndex系列并通过 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()

关于python - 将 diff() 应用于 pandas 多索引级别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57462264/

相关文章:

python - Pandas ,在保持秩序的同时对日子进行排序

python - Git Heroku 错误 [远程拒绝] ...(预接收 Hook 被拒绝)

python - 删除多值列

python - 使用 Pandas 和 spaCy 提取句子嵌入特征

python-3.x - 如何使随机森林分类器更快?

css - 删除多个文件中的重复 CSS 声明

c# - 如何在 Visual Studio 中查找两个 .cs 文件之间的差异

svn - 如何在版本控制系统中找到最匹配的修订版?

python - 使用 BeautifulSoup 获取 "' NoneType' 对象没有属性 'children' "

python - 麻麻。如何打开文件