我有一个数据框
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()应用于多索引级别。
谢谢。
答案 0 :(得分:2)
使用Index.to_series
创建新的MultiIndex Series
,并用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()