来自here。该解决方案仅适用于一列。如何改进多列的解决方案。即如果我有一个像
这样的数据框df= pd.DataFrame([['a','b'],['b','c'],['c','z'],['d','b']],index=[0,0,1,1])
0 1 0 a b 0 b c 1 c z 1 d b
如何像
那样重塑它们0 1 2 3 0 a b b c 1 c z d b
如果df是
0 1 0 a b 1 c z 1 d b
然后
0 1 2 3 0 a b NaN NaN 1 c z d b
答案 0 :(得分:3)
使用flatten/ravel
In [4401]: df.groupby(level=0).apply(lambda x: pd.Series(x.values.flatten()))
Out[4401]:
0 1 2 3
0 a b b c
1 c z d b
或者,stack
In [4413]: df.groupby(level=0).apply(lambda x: pd.Series(x.stack().values))
Out[4413]:
0 1 2 3
0 a b b c
1 c z d b
另外,指数不等
In [4435]: df.groupby(level=0).apply(lambda x: x.values.ravel()).apply(pd.Series)
Out[4435]:
0 1 2 3
0 a b NaN NaN
1 c z d b
答案 1 :(得分:2)
使用groupby
+ pd.Series
+ np.reshape
:
df.groupby(level=0).apply(lambda x: pd.Series(x.values.reshape(-1, )))
0 1 2 3
0 a b b c
1 c z d b
索引数量不等的解决方案 - 改为调用pd.DataFrame
构造函数。
df
0 1
0 a b
1 c z
1 d b
df.groupby(level=0).apply(lambda x: \
pd.DataFrame(x.values.reshape(1, -1))).reset_index(drop=True)
0 1 2 3
0 a b NaN NaN
1 c z d b
答案 2 :(得分:2)
pd.DataFrame({n: g.values.ravel() for n, g in df.groupby(level=0)}).T
0 1 2 3
0 a b b c
1 c z d b
这到处都是,我太累了,不能把它弄得很漂亮
v = df.values
cc = df.groupby(level=0).cumcount().values
i0, r = pd.factorize(df.index.values)
n, m = v.shape
j0 = np.tile(np.arange(m), n)
j = np.arange(r.size * m).reshape(-1, m)[cc].ravel()
i = i0.repeat(m)
e = np.empty((r.size, m * r.size), dtype=object)
e[i, j] = v.ravel()
pd.DataFrame(e, r)
0 1 2 3
0 a b None None
1 c z d b
答案 3 :(得分:1)
试试
df1 = df.set_index(df.groupby(level=0).cumcount(), append=True).unstack()
df1.set_axis(labels=pd.np.arange(len(df1.columns)), axis=1)
输出:
0 1 2 3
0 a b b c
1 c d z b
使用NaN输出df:
0 1 2 3
0 a None b None
1 c d z b