将 diff() 应用于 pandas 多索引级别?
Apply diff() to pandas multiindex level?
我有一个数据框
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
and seelct second values of tuples by str[1]
and then use DataFrameGroupBy.diff
创建新的 MultiIndex Series
:
df['C'] = df.index.to_series().str[1].groupby(level=0).diff()
或通过 DataFrame.assign
and 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
编辑:
来自 的另一个解决方案:
df.index.to_frame().groupby(level=0)['Price'].diff()
我有一个数据框
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
and seelct second values of tuples by str[1]
and then use DataFrameGroupBy.diff
创建新的 MultiIndex Series
:
df['C'] = df.index.to_series().str[1].groupby(level=0).diff()
或通过 DataFrame.assign
and 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
编辑:
来自
df.index.to_frame().groupby(level=0)['Price'].diff()