我有一个包含日期和公司名称的数据集。我只想保留行,以使公司名称和日期的组合至少出现两次在数据集中。
为说明问题,让我们假设我具有以下数据框:
df1 = pd.DataFrame(np.array([['28/02/2017', 'Apple'], ['28/02/2017', 'Apple'], ['31/03/2017', 'Apple'],['28/02/2017', 'IBM'],['28/02/2017', 'WalMart'],
['28/02/2017', 'WalMart'],['03/07/2017', 'WalMart']]), columns=['date','keyword'])
我想要的输出是:
df2 = pd.DataFrame(np.array([['28/02/2017', 'Apple'], ['28/02/2017', 'Apple'],
['28/02/2017', 'WalMart'],
['28/02/2017', 'WalMart']]), columns=['date', 'keyword'])
我会知道如何根据两列中的条件删除行,但是我无法弄清楚如何根据两个值的组合出现在数据集中的次数来删除行。
谁能提供一些见识?
答案 0 :(得分:6)
使用DataFrame.duplicated
,将指定列用于检查重复项,keep=False
用于通过boolean indexing
返回所有重复行:
df2 = df1[df1.duplicated(subset=['date','keyword'], keep=False)]
print (df2)
date keyword
0 28/02/2017 Apple
1 28/02/2017 Apple
4 28/02/2017 WalMart
5 28/02/2017 WalMart
如果需要指定行数,请使用GroupBy.transform
,并以GroupBy.size
计数:
df2 = df1[df1.groupby(['date','keyword'])['date'].transform('size') >= 2]
如果小型DataFrame或性能不重要,请使用filter:
df2 = df1.groupby(['date','keyword']).filter(lambda x: len(x) >= 2)
print (df2)
date keyword
0 28/02/2017 Apple
1 28/02/2017 Apple
4 28/02/2017 WalMart
5 28/02/2017 WalMart
答案 1 :(得分:3)
df1.groupby(['date','keyword']).apply(lambda x: x if len(x) >= 2 else None).dropna()
输出
date keyword
0 28/02/2017 Apple
1 28/02/2017 Apple
4 28/02/2017 WalMart
5 28/02/2017 WalMart