2017-02-20 49 views
0

可能有一个简单的方法来做到这一点,所以我希望有人有一个很好的解决方案(目前我正在为丑陋的循环做)。将多个列组合成两列:“列名”和“值”

我的数据是这样的:

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

也许不是最优雅的解决方案,但它适用于您的数据。使用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 

如果你想“上校”仅仅是列名的最后一个数字,可以做这样的事情:

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 
+0

谢谢,这是绝对远超过优雅我的for循环的解决方案; ) – tamasgal

+0

@tamasgal没问题!如果这对你有用,你能否将我的答案标记为已接受?谢谢! – jspring

+0

当然,不用担心,如果还有其他答案,我通常会等一下,但看起来他们不是;) – tamasgal