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)
我会知道如何根据两列中的条件删除行,但是我无法弄清楚如何根据两个值的组合出现在数据集中的次数来删除行。
谁能提供一些见识?
使用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)