将多列组合成两列:“列名称”和“值”

时间:2017-02-20 16:53:30

标签: pandas

可能有一种简单的方法可以做到这一点,所以我希望有人有一个很好的解决方案(目前我正在做丑陋的循环)。

我的数据如下:

In [1]: df = pd.DataFrame({'Ref':  [5, 6, 7],
                           'Col1': [10,11,12],
                           'Col2': [20,21,22],
                           'Col3': [30,31,32]})

In [2]: df
Out[2]:
   Col1  Col2  Col3  Ref
0    10    20    30    5
1    11    21    31    6
2    12    22    32    7

我试图将表格(对于2D直方图)展平,以使用单个列作为列id,使用一列作为实际值,同时保留相应的Ref,如下所示:

   Ref  Col  Value
0    5    1    10
1    5    2    20
2    5    3    30
3    6    1    11
4    6    2    21
5    6    3    31
6    7    1    12
7    7    2    22
8    7    3    32

我记得有一种连接/组操作可以进行反向操作,但我不记得了......

1 个答案:

答案 0 :(得分:1)

也许不是最优雅的解决方案,但它适用于您的数据。使用pivot_table和stack的组合。

import pandas as pd

df = pd.DataFrame({'Ref':  [5, 6, 7],
                           'Col1': [10,11,12],
                           'Col2': [20,21,22],
                           'Col3': [30,31,32]})
#    In [23]: df
#    Out[23]: 
#       Col1  Col2  Col3  Ref
#    0    10    20    30    5
#    1    11    21    31    6
#    2    12    22    32    7

piv = df.pivot_table(index=['Ref']).stack()
df2 = pd.DataFrame(piv)
df2.reset_index(inplace=True)
df2.columns = ['Ref','Col','Value']

#    In [19]: df2
#    Out[19]: 
#       Ref   Col  Value
#    0    5  Col1     10
#    1    5  Col2     20
#    2    5  Col3     30
#    3    6  Col1     11
#    4    6  Col2     21
#    5    6  Col3     31
#    6    7  Col1     12
#    7    7  Col2     22
#    8    7  Col3     32

如果你想要' Col'要只是列名的最后一位,可以这样做:

df2.Col = df2.Col.apply(lambda x: x[-1:])

#    In [21]: df2
#    Out[21]: 
#       Ref Col  Value
#    0    5   1     10
#    1    5   2     20
#    2    5   3     30
#    3    6   1     11
#    4    6   2     21
#    5    6   3     31
#    6    7   1     12
#    7    7   2     22
#    8    7   3     32
相关问题