Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 熊猫分组并填写缺失的时间间隔序列_Python_Python 3.x_Pandas_Dataframe_Pandas Groupby - Fatal编程技术网

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()
结果(对于个人id
11
):


关键是“重新索引”每个组的最小值/最大值并向前填充。请参见下面的方法之一

(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]
代替
范围
如果您不想更改
数据类型
值错误:无法从重复轴重新编制索引不确定为什么会出现此错误,它是因为重复的数据点?完全可能,因为我的一些时间值可能会重复..谢谢。向上投票