如何通过一列的值计数对熊猫数据框进行排序?

时间:2018-08-13 19:35:21

标签: python pandas

我想根据df['user_id'].value_counts()的结果对以下熊猫数据框进行排序。

import pandas as pd
n = 100
df = pd.DataFrame(index=pd.Index(range(1, n+1), name='gridimage_id'))
df['user_id'] = 2
df['has_term'] = True
df.iloc[:10, 0] = 1

排序应该是稳定的,这意味着虽然用户2的行将排在用户1的行之前,但用户2的行和用户1的行将保持原始顺序。

我当时正在考虑使用df.groupby,将df['user_id'].value_counts()与数据框合并以及将df['user_id']转换为有序的分类数据。但是,这些方法似乎都不是特别优雅。

在此先感谢您的帮助!

1 个答案:

答案 0 :(得分:5)

transformargsort

使用kind='mergesort'保持稳定

df.iloc[df.groupby('user_id').user_id.transform('size').argsort(kind='mergesort')]

factorizebincountargsort

使用kind='mergesort'保持稳定

i, r = pd.factorize(df['user_id'])
a = np.argsort(np.bincount(i)[i], kind='mergesort')
df.iloc[a]

回复评论

  

谢谢@piRSquared。但是,可以颠倒排序顺序吗? value_counts降序排列。在该示例中,用户2有90行,而用户1有10行。我希望用户2的行排在第一位。不幸的是,Series.argsort忽略了kwarg顺序。 – 4分钟前Iain Dillingham

又快又脏

使计数为负

df.iloc[df.groupby('user_id').user_id.transform('size').mul(-1).argsort(kind='mergesort')]

i, r = pd.factorize(df['user_id'])
a = np.argsort(-np.bincount(i)[i], kind='mergesort')
df.iloc[a]