根据熊猫中的groupby在数据框中添加和填充日期行

我有一个数据框,可以通过以下方式生成:

import pandas as pd
data = [['tom',10,'20190202',5],['nick',15,7],['juli',16,'20190203',8],['tom',17,'20190204',6],9],'20190207',3]] 
df = pd.DataFrame(data,columns = ['Employee','ID','Date','Value']) 

数据框如下所示:

根据熊猫中的groupby在数据框中添加和填充日期行

我需要这样的输出:

根据熊猫中的groupby在数据框中添加和填充日期行

需要根据以下假设生成新的数据框: 对于所有“雇员”和“ ID”,都将找到最大日期,并将“雇员”和“ ID”的前一个最后一个条目的数据重复复制,直到达到最大日期为止。

zzzzzadsddsazzzqq 回答:根据熊猫中的groupby在数据框中添加和填充日期行

首先由DataFrame.set_index创建DatetimeIndex,然后在GroupBy.apply中使用自定义lambda函数,其中每个组的最小日期时间的DataFrame.reindex和组Date的最大日期时间都向前填写缺失值:

#convert to datetimes if necessary
df['Date'] = pd.to_datetime(df['Date'])

df = (df.set_index('Date')
        .groupby(['Employee','ID'],sort=False)['Value']
        .apply(lambda x: x.reindex(pd.date_range(x.index.min(),df['Date'].max(),name='Date'),method='ffill'))
        .reset_index())
print (df)
   Employee  ID       Date  Value
0       tom  10 2019-02-02      5
1       tom  10 2019-02-03      5
2       tom  10 2019-02-04      9
3       tom  10 2019-02-05      9
4       tom  10 2019-02-06      9
5       tom  10 2019-02-07      9
6      nick  15 2019-02-02      7
7      nick  15 2019-02-03      7
8      nick  15 2019-02-04      7
9      nick  15 2019-02-05      7
10     nick  15 2019-02-06      7
11     nick  15 2019-02-07      3
12     juli  14 2019-02-03      8
13     juli  14 2019-02-04      8
14     juli  14 2019-02-05      8
15     juli  14 2019-02-06      8
16     juli  14 2019-02-07      8
17      tom  14 2019-02-04      6
18      tom  14 2019-02-05      6
19      tom  14 2019-02-06      6
20      tom  14 2019-02-07      6
,

@jezrel答案效果很好。但只是为了让观众也有多种选择来添加我的选项,这也是

df['Date']=pd.to_datetime(df['Date'])

def expand_dates(ser):
    return pd.DataFrame({'Date': pd.date_range(ser['Date'].min(),freq='D')})

newdf = df.groupby(['Employee','ID']).apply(expand_dates).reset_index()\
          .merge(df,how='left')[['Employee','ID','Date','Value']].ffill()
本文链接:https://www.f2er.com/2811450.html

大家都在问