Python 熊猫分组并填写缺失的时间间隔序列
我有一个如下所示的数据框Python 熊猫分组并填写缺失的时间间隔序列,python,python-3.x,pandas,dataframe,pandas-groupby,Python,Python 3.x,Pandas,Dataframe,Pandas Groupby,我有一个如下所示的数据框 df = pd.DataFrame({'person_id': [11,11,11,21,21,21,31,31,31,31,31], 'time' :[-1,5,17,11,25,39,46,4,100,150,1], 'value':[101,102,121,120,143,153,160,170,96,97,99]}) 我想做的是 a) 通过生成一个序列号(例如:1,2,3,4)填写缺少
df = pd.DataFrame({'person_id': [11,11,11,21,21,21,31,31,31,31,31],
'time' :[-1,5,17,11,25,39,46,4,100,150,1],
'value':[101,102,121,120,143,153,160,170,96,97,99]})
我想做的是
a) 通过生成一个序列号(例如:1,2,3,4)填写缺少的时间
,并从上一行复制该值(对于所有其他列)
我在尝试下面的东西
df.groupby(['person_id']).cumcount() + 1
df['sequence'] = g.cumcount() + 1
但这并不能帮助我获得预期的输出
我希望我的输出如下所示(1个主题的示例如下所示)
让我们先将
时间
列设置为数据框的索引,然后将分组依据
人员id上的数据框设置为每个按人员id
分类的组,使其索引
符合时间
列中指定的值范围,最后,选择所有组以获得所需的数据帧:
grp = df.set_index('time').groupby('person_id')
groups = [g.reindex(range(g.index.min(), g.index.max() + 1)).ffill().reset_index() for _, g in grp]
out = pd.concat(groups, ignore_index=True).reindex(df.columns, axis=1)
grp = df.groupby('person_id')['time']
idx = [(k, n) for k, t in grp for n in range(t.min(), t.max() + 1)]
out = df.set_index(['person_id', 'time']).reindex(idx).ffill().reset_index()
或者,您可以首先为每个person\u id
和time
列中指定的相应值范围创建元组对,然后reindex
数据帧:
grp = df.set_index('time').groupby('person_id')
groups = [g.reindex(range(g.index.min(), g.index.max() + 1)).ffill().reset_index() for _, g in grp]
out = pd.concat(groups, ignore_index=True).reindex(df.columns, axis=1)
grp = df.groupby('person_id')['time']
idx = [(k, n) for k, t in grp for n in range(t.min(), t.max() + 1)]
out = df.set_index(['person_id', 'time']).reindex(idx).ffill().reset_index()
结果(对于个人id11
):
关键是“重新索引”每个组的最小值/最大值并向前填充。请参见下面的方法之一
(df.groupby('person_id')['time']
.apply(lambda x:np.arange(x.min(), x.max()))
.explode()
.reset_index()
.merge(df, how='left')
.ffill()
)
谢谢不幸的是,我得到了这个错误
TypeError:'numpy.float64'对象不能解释为整数
。time
的dtype
列是float64
首先,我们需要将dtype
更改为int
,因为范围
接受它的参数为整数您可以使用np.r\u[g.index.min():g.index.max()+1]
代替范围
如果您不想更改数据类型
值错误:无法从重复轴重新编制索引不确定为什么会出现此错误,它是因为重复的数据点?完全可能,因为我的一些时间值可能会重复..谢谢。向上投票