Pandas:如何过滤数据框中出现至少n次的重复项

16

我有一个包含重复条目的Pandas DataFrame; 一些项目列两次或三次。我想要过滤它,以便仅显示至少列出n次的项目:

  • DataFrame包含3个列: ['colA'、'colB'、'colC']。它应该仅考虑“colB”在确定项目是否多次列出时。
  • 注意: 这不是drop_duplicates()。相反,我想删除少于n次在数据帧中的项目。
  • 最终结果应该只列出每个项目一次。
1个回答

31

你可以使用 value_counts 方法来获取元素数量,然后根据此构建布尔掩码,并通过引用索引并使用 isin 方法测试成员资格:

In [3]:
df = pd.DataFrame({'a':[0,0,0,1,2,2,3,3,3,3,3,3,4,4,4]})
df

Out[3]:
    a
0   0
1   0
2   0
3   1
4   2
5   2
6   3
7   3
8   3
9   3
10  3
11  3
12  4
13  4
14  4

In [8]:
df[df['a'].isin(df['a'].value_counts()[df['a'].value_counts()>2].index)]

Out[8]:
    a
0   0
1   0
2   0
6   3
7   3
8   3
9   3
10  3
11  3
12  4
13  4
14  4

因此,将上述内容分解为:

In [9]:
df['a'].value_counts() > 2

Out[9]:
3     True
4     True
0     True
2    False
1    False
Name: a, dtype: bool

In [10]:
# construct a boolean mask
df['a'].value_counts()[df['a'].value_counts()>2]

Out[10]:
3    6
4    3
0    3
Name: a, dtype: int64

In [11]:
# we're interested in the index here, pass this to isin
df['a'].value_counts()[df['a'].value_counts()>2].index

Out[11]:
Int64Index([3, 4, 0], dtype='int64')

编辑

正如用户@JonClements建议的那样,更简单、更快的方法是在感兴趣的列上进行groupby,然后进行filter操作:

In [4]:
df.groupby('a').filter(lambda x: len(x) > 2)

Out[4]:
    a
0   0
1   0
2   0
6   3
7   3
8   3
9   3
10  3
11  3
12  4
13  4
14  4

EDIT 2

要想在每次重复调用中只获取一个条目,请使用drop_duplicates函数并传递参数subset='a'

In [2]:
df.groupby('a').filter(lambda x: len(x) > 2).drop_duplicates(subset='a')

Out[2]:
    a
0   0
6   3
12  4

1
使用groupby覆盖value_counts可能更简单,但绝对不会更快。 - LucyDrops

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接