首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >熊猫使用上一期间填充行值

熊猫使用上一期间填充行值
EN

Stack Overflow用户
提问于 2021-04-18 02:24:11
回答 3查看 335关注 0票数 2

为了更好地解决这个问题,__,在实际的数据集中也有一个名为__的列,表可以按存储、日期和产品分组,当我尝试支点解决方案和笛卡儿产品解决方案时,它不起作用,是否有一个可以适用于3个分组列的解决方案?此外,该表有数百万行.

假设数据框架具有以下格式:

代码语言:javascript
复制
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)
代码语言:javascript
复制
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。

这就是我想要的结果:

代码语言:javascript
复制
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

请注意,这只是一个简短的数据框架,在现实中可能有许多日期期间,我只想填写产品和数量在第一个日期后,它已经被删除,不是所有日期之后。

做这件事最好的方法是什么?

EN

回答 3

Stack Overflow用户

发布于 2021-04-18 02:27:38

让我们试试pivot然后unstack

代码语言:javascript
复制
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
票数 3
EN

Stack Overflow用户

发布于 2021-04-18 03:14:09

您可以使用来自化脓者完成函数显式地公开缺失的值,并与填充物组合使用0填充缺失的值:

代码语言:javascript
复制
# pip install pyjanitor
# import janitor
df.complete(['date', 'product']).fillna(0)

       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
票数 1
EN

Stack Overflow用户

发布于 2021-04-18 02:36:16

另一种方法是创建产品的笛卡儿积&日期,然后将其加入到主dataframe以获得缺少的值。

代码语言:javascript
复制
#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)
代码语言:javascript
复制
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-07
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67144671

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档