2017-03-28 13 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 

すなわちグループに各列を名前として数字と数字のペアであり、数字はインデックスであった対応する名前でソートされています。

私はループで行うことができますが、私はそれを行うためのより「パンダシス」な方法がなければならないと考え続けています。これは私が上記のために使用されるコードです:

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

ああ、それは私に噛むためにいくつかのことを示します。最初のものは非常に簡潔ですが、それでも列をループします。もう1つはそれを避けます。ありがとう! – OldGeeksGuide

関連する問題