删除小于指定大小的组的行

2024-09-30 18:28:50 发布

您现在位置:Python中文网/ 问答频道 /正文

我有100 questions_id和50 user_idDataFrame个答案。每行代表一个特定用户的单个问题。这张桌子看起来像这样。你知道吗

user_id | question_id | timetaken | answer_1 | answer_2 |
1015    | 1           | 30        | A        | C        |
1015    | 2           | 45        | B        | B        |
1016    | 1           | 15        | A        | A        |
1016    | 2           | 55        | A        | D        |

我试图筛选出没有完成测试的用户。我这样做的思想过程是计算每个用户出现在表中的次数,如果user_id1015出现在user_id列中100次,我知道他们完成了100个问题。不幸的是,我不能使用question_id进行过滤,因为问题是随机的,所以用户可以回答5个问题,其中一个问题可能有question_id = 100。你知道吗

我以为这是我的solution,但无法计算user_id的出现次数。你知道吗


Tags: 答案用户answeriddataframe过程代表次数
2条回答

使用^{}^{},非常简洁,并用于此目的。你知道吗

df1 = df.groupby('user_id').filter(lambda x: len(x) > 100)

要获得更好的性能,请使用^{}^{}

m = dict(zip(*np.unique(df.user_id, return_counts=True)))
df[df['user_id'].map(m) > 100]

对计数更像100次的仅筛选行使用^{}^{}^{}用于返回与原始Series大小相同的DataFrame

df1 = df[df.groupby('user_id')['question_id'].transform('size') > 100]

性能:取决于行数和组长度,因此在实际数据中进行最佳测试:

np.random.seed(123)
N = 1000000
L = list('abcde') 
df = pd.DataFrame({'question_id': np.random.choice(L, N, p=(.75,.0001,.0005,.0005,.2489)),
                   'user_id':np.random.randint(10000,size=N)})
df = df.sort_values(['user_id','question_id']).reset_index(drop=True)

In [176]: %timeit df[df.groupby('user_id')['question_id'].transform('size') > 100]
74.8 ms ± 2.69 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)

#coldspeed solutions
In [177]: %timeit df.groupby('user_id').filter(lambda x: len(x) > 100)
1.4 s ± 44.6 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)

In [178]: %%timeit
     ...: m = dict(zip(*np.unique(df.user_id, return_counts=True)))
     ...: df[df['user_id'].map(m) > 100]
     ...: 
89.2 ms ± 3.6 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)

相关问题 更多 >