根据id对数据帧进行分组,并将id的值与最近几天的平均值相互粘贴



我有一个数据框架,我想根据id对数据进行分组,然后将每个id的值粘在一起。然而,由于id的数量不相等,我不得不用same values of the day before填充这些id的缺失值。

我提供了一个如下的例子,例如,对于id=1id=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=1val 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,计算iddate之间的笛卡尔乘积以填充缺失的日期,然后使用您的代码:

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

最新更新