如何通过公共键列在单个 pandas 数据帧中连接多行,我们让任何组合的行都有固定的长度限制(因为在这种情况下具有给定公共键的行数是可变的)?
具有类似表单的数据框...
key x1 x2 x3
-------------
1 a1 a2 a3
1 b1 b2 b3
2 c1 c2 c3
3 d1 d2 d3
3 e1 e2 e3
3 f1 f2 f3
3 g1 g2 g3
....
并想将其更改为类似
key x11 x12 x13 x21 x22 x23 x31 x32 x33
-------------
1 a1 a2 a3 b1 b2 b3 NA NA NA
2 c1 c2 c3 NA NA NA NA NA NA
3 d1 d2 d3 e1 e2 e3 f1 f2 f3
....
其中列 xjk 是第 j 行的第 k 个特征,与在同一行中分组的其他行具有相同的键,最多(在本例中手动设置为...)每组 3 个(但可能希望稍后更改,并且可能大于可分组行的数量(例如此处为 5),在这种情况下,它应该只填充 NA)。请注意,当要分组的单个原始行的最大限制小于最大限制时,我们用 NA 填充值,当行太多时,我们仅分组到最大行数限制,并将其余部分从数据帧中删除。另请注意,有时单个行可能有缺失值。
关于如何做到这一点的任何建议?
使用groupby
然后ravel
来展平组内的所有值:
lim = 5
df = df.set_index('key')
k = len(df.columns)
x = df.groupby(level=0).apply(
lambda z: z.iloc[:lim].values.ravel().tolist() +
[np.nan]*(lim*k-z.size))
x = pd.DataFrame(x.tolist(), x.index)
x.columns = [f'x{1+i//k}{1+i%k}' for i in x.columns]
print(x)
输出:
x11 x12 x13 x21 x22 x23 x31 x32 x33 x41 x42 x43 x51 x52 x53
key
1 a1 a2 a3 b1 b2 b3 NaN NaN NaN NaN NaN NaN NaN NaN NaN
2 c1 c2 c3 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
3 d1 d2 d3 e1 e2 e3 f1 f2 f3 g1 g2 g3 NaN NaN NaN