假设有一个 dataframe 如下:

user_name publish_time content
小明 2022-12-30 15:10:00 今天是 2022 年最后一天,我在广东
小刚 2022-01-01 12:23:33 今天是 2022 年第一天,我在加勒比
小王 2022-01-01 12:33:00 今天是 2022 年第一天,我在小刚身边
小刚 2023-01-01 02:15:45 今天是 2023 年第一天,我在百慕大
小明 2023-01-01 00:05:20 今天是 2023 年第一天,我还在广东

现在我们要统计 user_name 中出现两次及以上的行。肉眼可以看出就是小明、小刚各自两行共四行。

最开始我的思路是使用 drop_duplicated 按照 user_name 为 key 去重,将去重后的 dataframe 和原来的 dataframe 按照所有列为 key 合并后再去重,这样一来就只剩下 user_name 出现两次及以上的行了,但是这种思路扩展性不好,假如是出现 3 次及以上呢?计算量就更大了。

改进后的思路是:主要使用 pandas 的 value_counts 函数统计次数,isin 函数实现筛选,其代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
# -*- coding: utf-8 -*-
# author: inspurer(月小水长)
# create_time: 2023/1/7 8:58
# 运行环境 Python3.6+
# github https://github.com/inspurer
# website https://buyixiao.github.io/
# 微信公众号 月小水长

import pandas as pd

input_file = './狂人日记 2022.csv'

def remove_show_count_below_n(input_file, col, n=2):
df = pd.read_csv(input_file)

count_df = pd.DataFrame(df[col].value_counts())
count_df.columns = ['count']
not_below_n_index = count_df[count_df['count'] >= n].index
df = df[df[col].isin(not_below_n_index)]

df.to_csv('result.csv', index=False, encoding='utf-8-sig')

remove_show_count_below_n(input_file, col='user_name')

如有更优雅的方式(肯定有),请批评指正~