我的解决方案比您预期的要长一些,我敢肯定它可以缩短,但是:
g = df.groupby("A").apply(lambda x: pd.concat((x["B"], x["C"])))k = g.reset_index()k["i"] = k1.indexk["rn"] = k1.groupby("A")["i"].rank()k.pivot_table(rows="A", cols="rn", values=0)# output# rn 1 2 3 4 5 6# A # 1 10 12 11 22 20 8# 2 10 11 10 13 NaN NaN# 3 14 10 NaN NaN NaN NaN
有点解释。第一行,
g = df.groupby("A").apply(lambda x: pd.concat((x["B"],x["C"])))。这一组
df依据
A,然后将列
B和
C放入一列:
A 1 0 10 1 12 2 11 0 22 1 20 2 82 3 10 4 11 3 10 4 133 5 14 5 10
然后
k = g.reset_index(),创建顺序索引,结果是:
A level_1 00 1 0 101 1 1 122 1 2 113 1 0 224 1 1 205 1 2 86 2 3 107 2 4 118 2 3 109 2 4 1310 3 5 1411 3 5 10
现在,我想将此索引移到列中(我想听听如何在不重置索引的情况下创建顺序列)
k["i"] = k1.index:
A level_1 0 i0 1 0 10 01 1 1 12 12 1 2 11 23 1 0 22 34 1 1 20 45 1 2 8 56 2 3 10 67 2 4 11 78 2 3 10 89 2 4 13 910 3 5 14 1011 3 5 10 11
现在,
k["rn"] = k1.groupby("A")["i"].rank()将在每个行内添加row_number
A(例如
row_number() over(partition by A order by i)在SQL中:
A level_1 0 i rn0 1 0 10 0 11 1 1 12 1 22 1 2 11 2 33 1 0 22 3 44 1 1 20 4 55 1 2 8 5 66 2 3 10 6 17 2 4 11 7 28 2 3 10 8 39 2 4 13 9 410 3 5 14 10 111 3 5 10 11 2
最后,只需枢纽
k.pivot_table(rows="A", cols="rn", values=0):
rn 1 2 3 4 5 6A 1 10 12 11 22 20 82 10 11 10 13 NaN NaN3 14 10 NaN NaN NaN NaN
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)