如何通过索引重塑多列数据框?

时间:2017-09-28 10:55:26

标签: python pandas numpy dataframe

来自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

4 个答案:

答案 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