我有一个数据框架,我想根据id对数据进行分组,然后将每个id的值粘在一起。然而,由于id的数量不相等,我不得不用same values of the day before
填充这些id的缺失值。
我提供了一个如下的例子,例如,对于id=1
、id=2
有两个日期,但对于id=3
有三天。
df = pd.DataFrame()
df['id'] = [1, 1, 2,2, 3, 3, 3]
df['date'] = ['2019-01-01', '2019-01-03', '2019-01-01','2019-01-02', '2019-01-01', '2019-01-02','2019-01-03']
df['val1'] = [10, 100, 20, 30, 40, 50, 60]
df['val2'] = [30, 30, -20, -30, -40,-50, -60 ]
df['val3'] = [50, 10, 120, 300, 140, 150, 160]
我尝试了以下代码:
DF_sticked = df.filter(regex='vald+', axis=1).groupby(df['id'])
.apply(np.ravel).apply(pd.Series).rename(lambda x: f"val{x}", axis=1).reset_index().fillna(0)
但是,在上面的代码中,我用0填充了缺失的值。缺少的值也在列的末尾。我想要的输出如下。如您所见,id=1
的val 4, val5, val 6
与前一天的值相同。或者CCD_ 7等于前一天。
val0 val1 val2 val3 val4 val5 val6 val7 val8
id
1 10.0 30.0 50.0 10.0 30.0 50.0 100.0 30.0 10.0
2 20.0 -20.0 120.0 30.0 -30.0 300.0 30.0 -30.0 300.0
3 40.0 -40.0 140.0 50.0 -50.0 150.0 60.0 -60.0 160.0
非常感谢。
您实际上可以透视数据帧,然后将日期、transform('mean')
和ffill
:分组
tmp = df.pivot(index='id', columns='date').swaplevel(axis=1).sort_index(axis=1)
tmp[tmp.isna()] = tmp.groupby(level=0, axis=1).transform('mean').ffill(axis=1)
tmp = tmp.astype(int).droplevel(0, axis=1)
# Fix the columns
tmp = tmp.set_axis(np.arange(1, tmp.shape[1] + 1).astype(str), axis=1).add_prefix('val')
输出:
>>> tmp
val1 val2 val3 val4 val5 val6 val7 val8 val9
id
1 10 30 50 30 30 30 100 30 10
2 20 -20 120 30 -30 300 100 100 100
3 40 -40 140 50 -50 150 60 -60 160
IIUC,计算id
和date
之间的笛卡尔乘积以填充缺失的日期,然后使用您的代码:
mi = pd.MultiIndex.from_product([df['id'].unique(), df['date'].unique()], names=['id', 'date'])
df = df.set_index(['id', 'date']).reindex(mi).sort_index().ffill()
# Your code
df = df.groupby(level='id').apply(np.ravel).apply(pd.Series).add_prefix('val')
输出:
>>> df
val0 val1 val2 val3 val4 val5 val6 val7 val8
id
1 10.0 30.0 50.0 10.0 30.0 50.0 100.0 30.0 10.0
2 20.0 -20.0 120.0 30.0 -30.0 300.0 30.0 -30.0 300.0
3 40.0 -40.0 140.0 50.0 -50.0 150.0 60.0 -60.0 160.0