Jej*_*ort 2 python sorting multi-index dataframe pandas
我有一个熊猫数据框,看起来像这样:
value
Id
2014-03-13 1 -3
2 -6
3 -3.2
4 -3.1
5 -5
2014-03-14 1 -3.4
2 -6.2
3 -3.2
4 -3.2
5 -5.9
Run Code Online (Sandbox Code Playgroud)
这基本上是一个具有两个级别的多索引的groupby对象。
我想根据该value列以升序对其进行排序,但保持0级(日期)不变,以便结果应如下所示:
value
Id
2014-03-13 2 -6
5 -5
3 -3.2
4 -3.1
1 -3
2014-03-14 2 -6.2
5 -5.9
1 -3.4
3 -3.2
4 -3.2
Run Code Online (Sandbox Code Playgroud)
这是生成初始数据的代码:
import pandas as pd
dates = [pd.to_datetime('2014-03-13', format='%Y-%m-%d'), pd.to_datetime('2014-03-13', format='%Y-%m-%d'), pd.to_datetime('2014-03-13', format='%Y-%m-%d'), pd.to_datetime('2014-03-13', format='%Y-%m-%d'),
pd.to_datetime('2014-03-13', format='%Y-%m-%d'),pd.to_datetime('2014-03-14', format='%Y-%m-%d'), pd.to_datetime('2014-03-14', format='%Y-%m-%d'), pd.to_datetime('2014-03-14', format='%Y-%m-%d'),
pd.to_datetime('2014-03-14', format='%Y-%m-%d'), pd.to_datetime('2014-03-14', format='%Y-%m-%d')]
values = [-3,-6,-3.2,-3.1,-5,-3.4,-6.2,-3.2,-3.2,-5.9]
Ids = [1,2,3,4,5,1,2,3,4,5]
df = pd.DataFrame({'Id': pd.Series(Ids, index=dates),
'value': pd.Series(values, index=dates)})
df = df.groupby([df.index,'Id']).sum()
Run Code Online (Sandbox Code Playgroud)
对我来说,工作reset_index+ sort_values+ set_index+ rename_axis:
df = df.reset_index() \
.sort_values(['level_0','value']) \
.set_index(['level_0','Id']) \
.rename_axis([None, 'Id'])
print (df)
value
Id
2014-03-13 2 -6.0
5 -5.0
3 -3.2
4 -3.1
1 -3.0
2014-03-14 2 -6.2
5 -5.9
1 -3.4
3 -3.2
4 -3.2
Run Code Online (Sandbox Code Playgroud)
sort_values+ swaplevel+的另一种解决方案sort_index:
df = df.sort_values('value')
.swaplevel(0,1)
.sort_index(level=1, sort_remaining=False)
.swaplevel(0,1)
print (df)
value
Id
2014-03-13 2 -6.0
5 -5.0
3 -3.2
4 -3.1
1 -3.0
2014-03-14 2 -6.2
5 -5.9
1 -3.4
3 -3.2
4 -3.2
Run Code Online (Sandbox Code Playgroud)
交换级别是必要的,因为:
print (df.sort_values('value').sort_index(level=0, sort_remaining=False))
value
Id
2014-03-13 1 -3.0
2 -6.0
3 -3.2
4 -3.1
5 -5.0
2014-03-14 1 -3.4
2 -6.2
3 -3.2
4 -3.2
5 -5.9
Run Code Online (Sandbox Code Playgroud)
对于熊猫0.23.0,可以将列和索引级别一起排序:
df.index.names = ['level1','level2']
print (df.sort_values(['level1','value']))
value
level1 level2
2014-03-13 2 -6.0
5 -5.0
3 -3.2
4 -3.1
1 -3.0
2014-03-14 2 -6.2
5 -5.9
1 -3.4
3 -3.2
4 -3.2
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2003 次 |
| 最近记录: |