如何按列的值计数对pandas数据框进行排序?

Iai*_*ham 2 python pandas

我想根据结果对以下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
Run Code Online (Sandbox Code Playgroud)

排序应该是稳定的,这意味着虽然用户2的行将在用户1的行之前出现,但用户2的行和用户1的行将按原始顺序排列.

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

在此先感谢您的帮助!

piR*_*red 6

transformargsort

使用kind='mergesort'稳定

df.iloc[df.groupby('user_id').user_id.transform('size').argsort(kind='mergesort')]
Run Code Online (Sandbox Code Playgroud)

factorize,bincountargsort

使用kind='mergesort'稳定

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

对评论的回应

谢谢@piRSquared.但是可以反转排序顺序吗?value_counts按降序排列.在该示例中,用户2具有90行,而用户1具有10行.我希望用户2的行首先出现.不幸的是,Series.argsort忽略了命令kwarg. - Iain Dillingham 4分钟前

快速而肮脏

使计数为负数

df.iloc[df.groupby('user_id').user_id.transform('size').mul(-1).argsort(kind='mergesort')]
Run Code Online (Sandbox Code Playgroud)

要么

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