Pandas:如何过滤数据框中出现多次的项目

时间:2015-10-03 03:09:28

标签: python pandas filter duplicates

我有一个包含重复条目的Pandas DataFrame。有些物品也会列出两次或三次。我想过滤它,以便它只显示列出至少n次的项目。在决赛桌中,所有项目只应显示一次。 DataFrame包含3列:[colA,colB,colC]。它应该只考虑colB来确定该项是否被多次列出。注意:这不是drop_duplicates。相反,我想丢弃数据帧中少于n次的项目。

最终结果应仅列出每个项目一次。

2 个答案:

答案 0 :(得分:18)

您可以使用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对感兴趣的col和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

编辑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 :(得分:0)

首先,一些示例数据:

df = pd.DataFrame({'A': ['a'] * 4 + ['b'] * 3 + ['c'] * 2, 'B': [1] * 9})
>>> df
   A  B
0  a  1
1  a  1
2  a  1
3  a  1
4  b  1
5  b  1
6  b  1
7  c  1
8  c  1

接下来,让我们构建一个值列表,其中计数超过某个阈值:

from collections import Counter

threshold_count = 2
c = Counter(df.A)
relevant_items = [k for k, count in c.iteritems() if count > threshold_count]

现在,只需使用.loc来提取相关项目:

>>> df.loc[df.A.isin(relevant_items), :]
   A  B
0  a  1
1  a  1
2  a  1
3  a  1
4  b  1
5  b  1
6  b  1