2017-03-28 187 views
2

我有一个数据帧是这样的:转换大熊猫数据帧到多指标列

 a b c 
foo 1 6 9 
bar 2 4 8 
fud 3 5 7 

我想将它转化成这样的:每列

 a  b  c  
    name num name num name num 
0 foo 1 bar 4 fud 7 
1 bar 2 fud 5 bar 8 
2 fud 3 foo 6 foo 9 

即组的名称和数字对,用相应的名称排序数字,这些名称曾经是索引。

我可以做一个循环,但我一直在想,必须有更多的'pandasy'方法来做到这一点。这是我用上面的代码:

import pandas as pd 

my_index=['foo','bar','fud'] 
orig = pd.DataFrame({'a': [1,2,3], 'b':[6,4,5], 'c':[9,8,7]}, index=my_index) 
multi = pd.MultiIndex.from_product([['a','b','c'],['name','num']]) 
x = pd.DataFrame(index=range(3), columns=multi) 

for h in orig.columns: 
    s = orig[h].sort_values().reset_index() 
    x[h,'name'] = s['index'] 
    x[h,'num'] = s[h] 

我敢肯定有更好的方式来做到这一点,虽然如此,如果大熊猫专家能帮助我,这将是大加赞赏。

谢谢!

回答

1

pandas几许

def proc(s): 
    return s.sort_values().rename_axis('name').reset_index(name='num') 

pd.concat({j: proc(c) for j, c in df.iteritems()}, axis=1) 

    a  b  c  
    name num name num name num 
0 foo 1 bar 4 fud 7 
1 bar 2 fud 5 bar 8 
2 fud 3 foo 6 foo 9 

numpy

v = df.values 
a = v.argsort(0) 
r = np.arange(v.shape[1])[None, :] 

nums = pd.DataFrame(v[a, r], columns=df.columns) 
names = pd.DataFrame(df.index.values[a], columns=df.columns) 

pd.concat(
    [names, nums], 
    axis=1, 
    keys=['names', 'nums'] 
).swaplevel(0, 1, 1).sort_index(1) 

    a  b  c  
    name num name num name num 
0 foo 1 bar 4 fud 7 
1 bar 2 fud 5 bar 8 
2 fud 3 foo 6 foo 9 
+0

啊,这给了我一些东西来啃。第一个是非常简洁,但它仍然涉及循环通过列。第二个避免这一点。谢谢! – OldGeeksGuide