我想根据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']
转换为有序的分类数据。但是,这些方法似乎都不是特别优雅。
在此先感谢您的帮助!
答案 0 :(得分:5)
transform
和argsort
使用kind='mergesort'
保持稳定
df.iloc[df.groupby('user_id').user_id.transform('size').argsort(kind='mergesort')]
factorize
,bincount
和argsort
使用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]