为了更好地解决这个问题,__,在实际的数据集中也有一个名为__的列,表可以按存储、日期和产品分组,当我尝试支点解决方案和笛卡儿产品解决方案时,它不起作用,是否有一个可以适用于3个分组列的解决方案?此外,该表有数百万行.
假设数据框架具有以下格式:
d = {'product': ['a', 'b', 'c', 'a', 'b'], 'amount': [1, 2, 3, 5, 2], 'date': ['2020-6-6', '2020-6-6', '2020-6-6',
'2020-6-7', '2020-6-7']}
df = pd.DataFrame(data=d)print(df)
product amount date
0 a 1 2020-6-6
1 b 2 2020-6-6
2 c 3 2020-6-6
3 a 5 2020-6-7
4 b 2 2020-6-7在2020年-6-7日,产品c不再存在,我希望能够计算出每种产品数量的百分比变化或差异。
例如:df['diff'] = df.groupby('product')['amount'].diff()
但是,为了使其有效,并显示c的差值为-3和-100%,c将需要在下一个日期出现,其金额设置为0。
这就是我想要的结果:
print(df)
product amount date
0 a 1 2020-6-6
1 b 2 2020-6-6
2 c 3 2020-6-6
3 a 5 2020-6-7
4 b 2 2020-6-7
5 c 0 2020-6-7请注意,这只是一个简短的数据框架,在现实中可能有许多日期期间,我只想填写产品和数量在第一个日期后,它已经被删除,不是所有日期之后。
做这件事最好的方法是什么?
发布于 2021-04-18 02:27:38
让我们试试pivot然后unstack
out = df.pivot('product','date','amount').fillna(0).unstack().reset_index(name='amount')
date product amount
0 2020-6-6 a 1.0
1 2020-6-6 b 2.0
2 2020-6-6 c 3.0
3 2020-6-7 a 5.0
4 2020-6-7 b 2.0
5 2020-6-7 c 0.0发布于 2021-04-18 03:14:09
发布于 2021-04-18 02:36:16
另一种方法是创建产品的笛卡儿积&日期,然后将其加入到主dataframe以获得缺少的值。
#df['date'] = pd.to_datetime(df['date'])
#ensure you have a proper datetime object.
s = pd.merge( df[['product']].drop_duplicates().assign(ky=-1),
df[['date']].drop_duplicates().assign(ky=-1),
on=['ky']
).drop('ky',1)
df1 = pd.merge(df,s,
on = ['product','date']
,how='outer'
).fillna(0)print(df1)
product amount date
0 a 1.0 2020-06-06
1 b 2.0 2020-06-06
2 c 3.0 2020-06-06
3 a 5.0 2020-06-07
4 b 2.0 2020-06-07
5 c 0.0 2020-06-07https://stackoverflow.com/questions/67144671
复制相似问题