2017-03-07 2 views
2

私はパンダ:列ベクトルの対連結

df = pd.DataFrame({ 
'G1':[1.00,0.69,0.23,0.22,0.62], 
'G2':[0.03,0.41,0.74,0.35,0.62], 
'G3':[0.05,0.40,0.15,0.32,0.19], 
'G4':[0.30,0.20,0.51,0.70,0.67], 
'G5':[0.40,0.36,0.88,0.10,0.19] 
}) 

のようなフレームで働いていると私は列は、例えば、現在の列の対の順列になるように、それを操作したいですすべての列が10要素長になりました。たとえば列 'G1:G2'の列 'G1'に列 'G2'が追加されました。モックアップ写真を添付し​​ました。 picは上のサンプルコードとは異なり、指名されていることに注意してください。私は指数の有無にかかわらず働くことができます。

私はこれにどのようにアプローチできますか?私は各列に作用する関数を作ることができますが、関数は他のすべての列との連結によって作成されたデータフレームを返さなければならないと思います。それがどのように見えるかわからない。ここで

enter image description here

答えて

1

私もこれは作成しないようにするには、出力

の一部であるパンダ

from itertools import permutations 

'''Get all the column permutations''' 
lst = [x for x in permutations(df.columns, 2)] 

'''Create a list of columns names''' 
names = [x[0]+'_'+x[1] for x in lst] 

'''Create the new arrays by vertically stacking pairs of column values''' 
cols = [np.vstack((df[x[0]].values,df[x[1]].values)).ravel() for x in lst] 

'''Create a dictionary with column names as keys and the arrays as values''' 
d = dict(zip(names, cols)) 

'''Create new dataframe from dict''' 
df2 = pd.DataFrame(d) 

df2 

    G1_G2 G1_G3 G1_G4 G1_G5 G2_G1 G2_G3 G2_G4 G2_G5 G3_G1 G3_G2 \ 
0 1.00 1.00 1.00 1.00 0.03 0.03 0.03 0.03 0.05 0.05 
1 0.69 0.69 0.69 0.69 0.41 0.41 0.41 0.41 0.40 0.40 
2 0.23 0.23 0.23 0.23 0.74 0.74 0.74 0.74 0.15 0.15 
3 0.22 0.22 0.22 0.22 0.35 0.35 0.35 0.35 0.32 0.32 
4 0.62 0.62 0.62 0.62 0.62 0.62 0.62 0.62 0.19 0.19 
5 0.03 0.05 0.30 0.40 1.00 0.05 0.30 0.40 1.00 0.03 
6 0.41 0.40 0.20 0.36 0.69 0.40 0.20 0.36 0.69 0.41 
7 0.74 0.15 0.51 0.88 0.23 0.15 0.51 0.88 0.23 0.74 
8 0.35 0.32 0.70 0.10 0.22 0.32 0.70 0.10 0.22 0.35 
9 0.62 0.19 0.67 0.19 0.62 0.19 0.67 0.19 0.62 0.62 

で直接これを行う方法があるかもしれない疑いがあるものの、一つの方法でありますitertools.permutationsがジェネレータであるという事実を列挙し、使用する:

d = dict((x[0]+'_'+x[1] , np.vstack((df[x[0]].values,df[x[1]].values)).ravel()) 
         for x in permutations(df.columns, 2)) 

df2 = pd.DataFrame(d) 
2

私もこの

from itertools import permutations 

l1, l2 = map(list, zip(*permutations(range(len(df.columns)), 2))) 

v = df.values 
pd.DataFrame(
    np.vstack([v[:, l1], v[:, l2]]), 
    list(map('S{}'.format, range(1, len(df) + 1))) * 2, 
    df.columns.values[l1] + ':' + df.columns.values[l2] 
) 

enter image description here

+0

グッドnigthのようにそれを行うだろう。) – jezrael