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

arc*_*ina 5 python dataframe pandas

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

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

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'])
Run Code Online (Sandbox Code Playgroud)

我想要的输出将是:

df2 = pd.DataFrame(np.array([['28/02/2017', 'Apple'], ['28/02/2017', 'Apple'],
                             ['28/02/2017', 'WalMart'],
                             ['28/02/2017', 'WalMart']]), columns=['date', 'keyword'])

Run Code Online (Sandbox Code Playgroud)

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

谁能提供一些见识?

jez*_*ael 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
Run Code Online (Sandbox Code Playgroud)

如果需要,请指定行数,并使用GroupBy.transformcount by GroupBy.size

df2 = df1[df1.groupby(['date','keyword'])['date'].transform('size') >= 2]
Run Code Online (Sandbox Code Playgroud)

如果较小的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
Run Code Online (Sandbox Code Playgroud)