如果两列中的记录未在数据集中至少同时出现两次,请在熊猫中删除行

时间:2019-07-08 10:38:01

标签: python pandas dataframe

我有一个包含日期和公司名称的数据集。我只想保留行,以使公司名称和日期的组合至少出现两次在数据集中。

为说明问题,让我们假设我具有以下数据框:

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'])

我会知道如何根据两列中的条件删除行,但是我无法弄清楚如何根据两个值的组合出现在数据集中的次数来删除行。

谁能提供一些见识?

2 个答案:

答案 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