含帐户的Groupby-无法按预期工作

时间:2019-01-24 20:07:47

标签: python-3.x pandas

我正在寻找最后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。

有什么建议吗?

2 个答案:

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