Pandas:按频率对列中具有相同值的列进行排序

时间:2017-05-15 06:31:43

标签: python sorting pandas frequency

我的数据框是 y列分组,并按 y列计数列进行排序。

代码:

df['count'] = df.groupby(['y'])['y'].transform(pd.Series.value_counts)
df = df.sort('count', ascending=False)

输出:

x   y   count
1   a   4
3   a   4
2   a   4
1   a   4
2   c   3
1   c   3
2   c   3
2   b   2
1   b   2

现在,我想在频率上对 x列进行排序,并在 y列上分组相同的值,如下所示:

预期输出:

x   y   count
1   a   4
1   a   4
2   a   4
3   a   4
2   c   3
2   c   3
1   c   3
2   b   2
1   b   2

2 个答案:

答案 0 :(得分:1)

您似乎需要groupbyvalue_counts然后numpy.repeat才能将展开索引值计算为DataFrame

s = df.groupby('y', sort=False)['x'].value_counts()
#alternative
#s = df.groupby('y', sort=False)['x'].apply(pd.Series.value_counts)
print (s)
y  x
a  1    2
   2    1
   3    1
c  2    2
   1    1
b  1    1
   2    1
Name: x, dtype: int64

df1 = pd.DataFrame(np.repeat(s.index.values, s.values).tolist(), columns=['y','x'])
#change order of columns
df1 = df1.reindex_axis(['x','y'], axis=1)
print (df1)
   x  y
0  1  a
1  1  a
2  2  a
3  3  a
4  2  c
5  2  c
6  1  c
7  1  b
8  2  b

答案 1 :(得分:1)

如果您使用的是不支持df.sort_values的旧版本。你可以使用:

df.sort(columns=['count','x'], ascending=[False,True])