如何用Pandas的value_counts()统计满足条件的指定列值频次?
问题:带条件统计DataFrame中列值的出现频次
需要统计DataFrame中满足特定条件的值的数量:在给定DataFrame里,统计Matched Previous ID列中,对应Max Score列值大于0.55的各值出现次数。
示例DataFrame:
Next ID Max Score Matched Previous ID 0 1 0.893201 1 1 2 0.858763 2 2 3 0.902589 3 3 8 0.806605 8 4 15 0.867527 15 5 21 0.536942 21 6 22 0.909944 22 7 28 0.828891 28 8 94 0.223704 4 9 96 0.583676 4
预期结果:值4出现1次,值21出现0次(其对应分数低于0.55)。已知df.value_counts()可无条件统计频次,请问能否结合条件使用,具体该如何操作?
解决方法
当然可以结合条件使用,以下是两种常用实现方式:
方法1:先过滤再统计
先通过布尔索引筛选出Max Score > 0.55的行,再对目标列执行value_counts():
# 筛选符合分数条件的行 filtered_rows = df[df['Max Score'] > 0.55] # 统计目标列的频次 counts = filtered_rows['Matched Previous ID'].value_counts()
执行后,counts会得到符合条件的ID频次(示例中4会显示1次,21不会出现在结果里)。如果需要把所有原ID都显示出来(包括频次为0的),可以用reindex补全:
# 获取原列所有唯一ID all_ids = df['Matched Previous ID'].unique() # 补全0值并排序(可选) counts_with_zero = counts.reindex(all_ids, fill_value=0).sort_index()
这样结果里就会包含21,且频次为0,完全匹配预期。
方法2:分组后条件计数
用groupby按Matched Previous ID分组,再统计每组中满足分数条件的行数:
counts = df.groupby('Matched Previous ID')['Max Score'].apply(lambda x: (x > 0.55).sum())
这种方式会直接返回所有原ID的计数结果,包括频次为0的情况(示例中21对应的结果就是0),无需额外补全。
内容的提问来源于stack exchange,提问作者Donnerhorn
相关产品推荐
相关产品推荐

