我有一个数据帧df1,它由跨时间的实体及其对应的值组成。 df1看起来像这样:
Index Date ID Values
0 2016-11-15 1 3
1 2016-11-16 1 5
2 2016-11-16 2 6
3 2016-11-17 2 7
4 2016-11-18 2 2
显然,两个身份证的日期都存在差距 我首先要填写日期和ID空白,看起来像这样:
Index Date ID Values
0 2016-11-15 1 3
1 2016-11-16 1 5
2 2016-11-17 1 0
3 2016-11-18 1 0
4 2016-11-15 2 0
5 2016-11-16 2 6
6 2016-11-17 2 7
7 2016-11-18 2 2
然后,我想为"值"创建一个滞后列。所以它使用前一天的每个id的值:
Index Date ID Values Lagged Values
0 2016-11-15 1 3 Nan
1 2016-11-16 1 5 3
2 2016-11-17 1 0 5
3 2016-11-18 1 0 0
4 2016-11-15 2 0 Nan
5 2016-11-16 2 6 0
6 2016-11-17 2 7 6
7 2016-11-18 2 2 7
谢谢!
答案 0 :(得分:0)
您可以使用cumcount +1从日期中获取ID列,然后您可以使用numpy并根据cumcount = 0将nan设置为列,即 例如:
import numpy as np
df = pd.DataFrame({'Date':['15-6-17','16-6-17','17-6-17','18-6-17','15-6-17','16-6-17','17-6-17','18-6-17'],"Values":[3,5,7,0,0,1,7,9]})
df['ID'] = df.groupby(['Date']).cumcount()+1
df['Lagged Values'] = np.insert(df.Values.values,0,0)[:-1]
df.loc[df.groupby(["ID"]).cumcount() == 0,'Lagged Values']= np.nan
Date Values ID Lagged Values 0 15-6-17 3 1 NaN 1 16-6-17 5 1 3.0 2 17-6-17 7 1 5.0 3 18-6-17 0 1 7.0 4 15-6-17 0 2 NaN 5 16-6-17 1 2 0.0 6 17-6-17 7 2 1.0 7 18-6-17 9 2 7.0
答案 1 :(得分:0)
我们试试这个:
df2 = (df1.set_index('Date')
.groupby('ID')
.apply(lambda x: x.reindex_axis(pd.date_range(df1.Date.min(), df1.Date.max())))
.drop('ID', axis=1)
.fillna(0))
df2['Lagged Values'] = (df2.groupby('ID',as_index=False)
.apply(lambda x: x.shift(1).Values)
.reset_index(level=0, drop=True))
print(df2.reset_index())
输出:
ID level_1 Values Lagged Values
0 1 2016-11-15 3.0 NaN
1 1 2016-11-16 5.0 3.0
2 1 2016-11-17 0.0 5.0
3 1 2016-11-18 0.0 0.0
4 2 2016-11-15 0.0 NaN
5 2 2016-11-16 6.0 0.0
6 2 2016-11-17 7.0 6.0
7 2 2016-11-18 2.0 7.0