熊猫:将列值“分配”到多行

时间:2016-05-02 18:10:20

标签: python pandas

我是一名熊猫新手,我正在努力解决以下问题。

我有一个很大的DataFrame(10000 x 28),如下所示。

Col1 Col2 Col3 Col4 Col5
  A    B   C    D    E

我怎样才能将其重塑为如下所示?

Col1 Col2 NewColName
  A    B    C
  A    B    D
  A    B    E

前两列保持不变,最后三列在其上“分布”。

我的目标是取一大片DataFrame并将其变成“整洁的数据”

我尝试过concat,stack等方法,但我觉得我错过了解决这个问题的优雅方法。

2 个答案:

答案 0 :(得分:1)

['Col1, 'Col2]设为index并使用.stack()

df.set_index(['Col1', 'Col2']).stack()

Col1  Col2   
A     B     0    C
            0    D
            0    E

然后按照示例中的.reset_index()进行格式设置(您也可以添加name='Col'以获得@jezrael建议的相同结果:

df.reset_index(-1, drop=True).reset_index(name='Col')

  Col1 Col2  0
0    A    B  C
1    A    B  D
2    A    B  E

答案 1 :(得分:1)

您可以使用meltdrop

print pd.melt(df, id_vars=['Col1','Col2'],value_name='Col').drop('variable', axis=1)
  Col1 Col2 Col
0    A    B   C
1    A    B   D
2    A    B   E

<强>计时

df = pd.concat([df]*1000).reset_index(drop=True)

In [58]: %timeit pd.melt(df, id_vars=['Col1','Col2'],value_name='Col').drop('variable', axis=1)
100 loops, best of 3: 2.48 ms per loop

In [59]: %timeit df.set_index(['Col1', 'Col2']).stack().reset_index(-1, drop=True).reset_index(name='Col')
100 loops, best of 3: 3.83 ms per loop