我有一个由多索引操作生成的数据帧,看起来像这样。
Col3
Col1 Col2
A A1 N
B B1 N
B2 N
C C1 N
C2 N
C3 N
我正在尝试按级别A,B和C的行的降序计数对此数据帧进行排序。在这种情况下,级别A有1行,B有2行,而C有3行...所以输出将是
Col3
Col1 Col2
C C1 N
C2 N
C3 N
B B1 N
B2 N
A A1 N
我可以想到通过实际计算每个级别的行数并向df添加一列来进行排序来手动执行此操作,但是有更优雅的方法吗?如果是这样,有没有办法推广到更多层次?
谢谢!
编辑:生成原始数据帧的代码。
df = pd.DataFrame([['a', 'z', 'x', 0.123], ['a','z', 'x', 0.234],
['a', 'z', 'y', 0.451], ['b', 'z', 'x', 0.453], ['b', 'z', 'x', 0.453], ['b', 'z', 'x', 0.453], ['b', 'z', 'x', 0.453]],
columns=['first', 'second', 'value1', 'value2']
).set_index(['first', 'second'])
正在运行df.ix[df.groupby(level=0).size().sort_values(ascending=False).index,:]
会产生TypeError: Expected tuple, got str
答案 0 :(得分:2)
IIUC你可以在第一个索引级别按groupby
进行,然后对size
进行排序并使用它来重新索引到你的df中:
In [25]:
df.ix[df.groupby(level=0).size().sort_values(ascending=False).index,:]
Out[25]:
Col3
Col1 Col2
C C1 N
C2 N
C3 N
B B1 N
B2 N
A A1 N
打破上述情况:
In [26]:
df.groupby(level=0).size()
Out[26]:
Col1
A 1
B 2
C 3
dtype: int64
In [27]:
df.groupby(level=0).size().sort_values(ascending=False)
Out[27]:
Col1
C 3
B 2
A 1
dtype: int64
In [28]:
df.groupby(level=0).size().sort_values(ascending=False).index
Out[28]:
Index(['C', 'B', 'A'], dtype='object', name='Col1')
修改强>
确定这比我预期的要复杂,但以下工作:
In [76]:
i = df.index.get_level_values(0)
df.iloc[i.reindex(df.groupby(level=0).size().sort_values(ascending=False).index)[1]]
Out[76]:
value1 value2
first second
b z x 0.453
z x 0.453
z x 0.453
z x 0.453
a z x 0.123
z x 0.234
z y 0.451
这样做的是获取第一级索引值,然后reindex
将它们与groupby
结果对应,并使用针对原始df生成的int索引