这里有很多类似的问题,但我找不到任何实际上有相同日期时间的观察结果。最小的非工作示例是:
df = pd.DataFrame(
{"Date": np.tile([pd.Series(["2016-01", "2016-03"])], 2)[0],
"Group": [1,1,2,2],
"Obs":[1,2,5,6]})
现在我想按组线性插入2016年2月的值,因此所需的输出是
Date Group Obs
2016-01 1 1
2016-02 1 1.5
2016-03 1 2
2016-01 2 5
2016-02 2 5.5
2016-03 2 6
我的理解是resample
应该能够做到这一点(在我的实际应用中,我试图从季度变为月度,所以在1月和4月进行观察),但这需要某种形式时间索引,我无法做到,因为Date
列中有重复项。
我假设某种groupby
魔法可以提供帮助,但无法弄明白!
答案 0 :(得分:2)
您可以使用:
#convert column Date to datetime
df['Date'] = pd.to_datetime(df.Date)
print (df)
Date Group Obs
0 2016-01-01 1 1
1 2016-03-01 1 2
2 2016-01-01 2 5
3 2016-03-01 2 6
#groupby, resample and interpolate
df1 = df.groupby('Group').apply(lambda x : x.set_index('Date')
.resample('M')
.first()
.interpolate())
.reset_index(level=0, drop=True).reset_index()
#convert Date to period
df1['Date'] = df1.Date.dt.to_period('M')
print (df1)
Date Group Obs
0 2016-01 1.0 1.0
1 2016-02 1.0 1.5
2 2016-03 1.0 2.0
3 2016-01 2.0 5.0
4 2016-02 2.0 5.5
5 2016-03 2.0 6.0
编辑:
Pandas API已更改(0.18.1),因此现在您可以使用:
df['Date'] = pd.to_datetime(df.Date)
df.set_index('Date', inplace=True)
df1 = df.groupby('Group').apply(lambda df1: df1.resample('M')
.first()
.interpolate())
.reset_index(level=0, drop=True).reset_index()
df1['Date'] = df1.Date.dt.to_period('M')
print (df1)
Date Group Obs
0 2016-01 1.0 1.0
1 2016-02 1.0 1.5
2 2016-03 1.0 2.0
3 2016-01 2.0 5.0
4 2016-02 2.0 5.5
5 2016-03 2.0 6.0
答案 1 :(得分:1)
修改:将resample
替换为reindex
,速度提升了2倍。
df.set_index('Date', inplace=True)
index = ['2016-01', '2016-02', '2016-03']
df.groupby('Group').apply(lambda df1: df1.reindex(index).interpolate())
一旦您理解,只需在分组列中为每个值返回一个数据框(此处为groupby
),就可以轻松使用df1
。