我正在寻找最后5次售出产品的数据框,并且遇到了问题。
这是我的数据框:
np.random.seed(1111)
df = pd.DataFrame({
'Category':np.random.choice( ['Group A','Group B'], 10000),
'Sub-Category':np.random.choice( ['X','Y','Z'], 10000),
'Sub-Category-2':np.random.choice( ['G','F','I'], 10000),
'Product':np.random.choice( ['Product 1','Product 2','Product 3'], 10000),
'Units_Sold':np.random.randint(1,100, size=(10000)),
'Dollars_Sold':np.random.randint(100,1000, size=10000),
'Customer':np.random.choice(pd.util.testing.rands_array(10,25,dtype='str'),10000),
'Date':np.random.choice( pd.date_range('1/1/2016','12/31/2018',
freq='D'), 10000)})
我认为我可以按日期对数据框进行排序,然后使用.cumcount()创建一个帮助列,以供以后过滤。这是我尝试过的:
df = df.sort_values('Date',ascending=False)
df['count_product'] = df.groupby(['Date','Product']).cumcount() + 1
df2 = df.loc[df.count_product < 5]
这无法正常工作。根据上面的数据,我希望产品1到新数据框中包含的以下日期:2018-12-31、2018-12-30、2018-12-29、2018-12-28和2018-12 -27。产品3的日期为2018-12-31、2018-12-30、2018-12-29、2018-12-28和2018-12-26。
有什么建议吗?
答案 0 :(得分:1)
先检查drop_duplicates
,再检查groupby
,再检查head
,过滤后,我们使用merge
yourdf=df.drop_duplicates(['Product','Date']).groupby('Product').head(4)[['Product','Date']].merge(df)
答案 1 :(得分:0)
您可以从分组依据中创建过滤器:
s = df.groupby('Product').apply(lambda x: x.Date.ge(x.Date.drop_duplicates().nlargest(5).iloc[-1])).reset_index(0, True)
df2 = df.loc[s]
只需检查:
df2.groupby('Product').Date.agg(['min', 'max'])
min max
Product
Product 1 2018-12-27 2018-12-31
Product 2 2018-12-27 2018-12-31
Product 3 2018-12-26 2018-12-31