更改 pandas 系列中的多索引?
Changing multiindex in a pandas series?
我有一个这样的数据框:
mainid pidl pidw score
0 Austria 1 533
1 Canada 2 754
2 Canada 3 267
3 Austria 4 852
4 Taiwan 5 124
5 Slovakia 6 344
6 Spain 7 1556
7 Taiwan 8 127
我想 select 每个 pidl 的前 5 个 pidw。
当我按 'pidl' 列分组,然后按每组中的降序对分数进行排序时,我得到以下系列,s..
s= df.set_index(['pidl', 'pidw']).groupby('pidl')['score'].nlargest(5)
pidl pidl pidw score
Austria Austria 49 948
47 859
48 855
50 807
46 727
Belgium Belgium 15 2339
14 1861
45 1692
16 1626
46 1423
Name: score, dtype: float64
结果看起来是正确的,但我希望我能从这个系列中删除第二个 'pidl'。
我试过了
s.reset_index('pidl')
得到'ValueError: The name location occurs multiple times, use a level number'.
和
s.to_frame().reset_index()
ValueError: 无法插入 pidl,已经存在。
所以我不确定如何进行。
在DataFrame.groupby
中使用group_keys=False
参数:
s= df.set_index(['pidl', 'pidw']).groupby('pidl', group_keys=False)['score'].nlargest(5)
print (s)
pidl pidw
Austria 4 852
1 533
Canada 2 754
3 267
Slovakia 6 344
Spain 7 1556
Taiwan 8 127
5 124
Name: score, dtype: int64
或添加 Series.droplevel
以删除第一级(pandas 从 0
开始计算,因此使用 0
):
s= df.set_index(['pidl', 'pidw']).groupby('pidl')['score'].nlargest(5).droplevel(0)
我有一个这样的数据框:
mainid pidl pidw score
0 Austria 1 533
1 Canada 2 754
2 Canada 3 267
3 Austria 4 852
4 Taiwan 5 124
5 Slovakia 6 344
6 Spain 7 1556
7 Taiwan 8 127
我想 select 每个 pidl 的前 5 个 pidw。 当我按 'pidl' 列分组,然后按每组中的降序对分数进行排序时,我得到以下系列,s..
s= df.set_index(['pidl', 'pidw']).groupby('pidl')['score'].nlargest(5)
pidl pidl pidw score
Austria Austria 49 948
47 859
48 855
50 807
46 727
Belgium Belgium 15 2339
14 1861
45 1692
16 1626
46 1423
Name: score, dtype: float64
结果看起来是正确的,但我希望我能从这个系列中删除第二个 'pidl'。
我试过了
s.reset_index('pidl')
得到'ValueError: The name location occurs multiple times, use a level number'.
和
s.to_frame().reset_index()
ValueError: 无法插入 pidl,已经存在。
所以我不确定如何进行。
在DataFrame.groupby
中使用group_keys=False
参数:
s= df.set_index(['pidl', 'pidw']).groupby('pidl', group_keys=False)['score'].nlargest(5)
print (s)
pidl pidw
Austria 4 852
1 533
Canada 2 754
3 267
Slovakia 6 344
Spain 7 1556
Taiwan 8 127
5 124
Name: score, dtype: int64
或添加 Series.droplevel
以删除第一级(pandas 从 0
开始计算,因此使用 0
):
s= df.set_index(['pidl', 'pidw']).groupby('pidl')['score'].nlargest(5).droplevel(0)