我有一个包含重复条目的Pandas DataFrame; 一些项目列两次或三次。我想要过滤它,以便仅显示至少列出n次的项目:
- DataFrame包含3个列: ['colA'、'colB'、'colC']。它应该仅考虑“colB”在确定项目是否多次列出时。
- 注意: 这不是
drop_duplicates()
。相反,我想删除少于n次在数据帧中的项目。 - 最终结果应该只列出每个项目一次。
我有一个包含重复条目的Pandas DataFrame; 一些项目列两次或三次。我想要过滤它,以便仅显示至少列出n次的项目:
drop_duplicates()
。相反,我想删除少于n次在数据帧中的项目。你可以使用 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