如何通过公共键列(固定长度限制)连接单个 pandas 数据帧中的多行?



如何通过公共键列在单个 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

最新更新