我有一个数据框
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.assign
和 Index.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/