重新格式化Pandas数据框,将1列的值作为列,将其他列重新格式化为行

时间:2016-07-13 18:21:39

标签: python pandas

我的df结构如下:

name   date   A   B   C
n1     07/01  a   b   c
n1     06/01  aa  bb  cc
n1     05/01  aaa bbb ccc
...

我需要构建数据框,使其看起来像:

name   letters   05/01   06/01   07/01
n1     A        aaa     aa      a
n1     B        bbb     bb      b
n1     C        ccc     cc      c
...

我可以使用melt()中的pandas将所有列拉到新行:

import pandas as pd
pd.melt(df, id_vars=["name"], var_name = "letters")

哪个收益率:

name   letters   value
n1     date      05/01
n1     date      06/01
n1     date      07/01
n1     A         aaa 
n1     A         aa
n1     A         a
n1     B         bbb   
n1     B         bb
n1     B         b
n1     C         ccc
n1     C         cc
n1     C         c    
...

现在我如何通过“日期”将其转出来获得我想要的结构?

我不确定如何在“字母”列中的“日期”行中应用df.pivot()。有任何建议或替代步骤吗?

3 个答案:

答案 0 :(得分:1)

试试这个:

df1 = df.drop('name', 1).set_index('date').rename_axis('letters', 1).sort_index(1, ascending=1).T.reset_index()
df1.set_index(pd.Index(['n1'] * len(df1), name='name')).reset_index().rename_axis(None, 1)

enter image description here

答案 1 :(得分:0)

我想保留我的另一个答案,但我认为这是一个更好的答案。

tpose = lambda df: df.drop('name', 1).set_index('date').T
df.groupby('name', as_index=True).apply(tpose)

enter image description here

我们需要进行调整才能达到您可能想要的最终格式,但我认为这样做更加丑陋。

调整

tpose = lambda df: df.drop('name', 1).set_index('date').T
df1 = df.groupby('name', as_index=True).apply(tpose)
df1.rename_axis(['name', 'letters']).reset_index().rename_axis(None, 1)

enter image description here

这完全适用于您拥有的任何长度数据集以及'name'

中的任何变量值

答案 2 :(得分:0)

试试这个:

 pd.concat([df[["name"]],df.iloc[:,1:].set_index("date").T.reset_index()],axis= 1 ).rename(columns = {'index':'letter'})

  name letter 07/01 06/01 05/01
0   n1      A     a    aa   aaa
1   n1      B     b    bb   bbb
2   n1      C     c    cc   ccc