2016-11-09 12 views
1

輸出は、相互作用のファイルとしてデータフレームをパンダ:行 tの値トンコル以下PDのデータフレームで

print(df) 
    A B C 
X 1 2 3 
Y 4 5 6 
Z 7 8 9 

私はフォーマットの、シンプルな相互作用ネットワークファイル、またはSIFファイルを作成する必要があります。

node1 xx node2 
node1 xx node2 
node1 yy node2 
. 
. 
. 

各行は、df:行ラベル、値、列ラベルの対話です。非効率的なコードは、上記のデータフレームdfのファイルSIFの理想を提供しています

with open ('interaction.sif', 'w') as sif: 
    for row in df.index: 
     for col in df.columns: 
      sif.write('{}\t{}\t{}'.format(row, df[col][row], col)) 

X 1 A 
X 2 B 
X 3 C 
Y 4 A 
Y 5 B 
Y 6 C 
Z 7 A 
Z 8 B 
Z 9 C 

書き込むためのデータフレームの方法があり、以下のようなファイルを書き込む反復(ナイーブ)アプローチがありますたとえば、上記の形式でCSVまたはテーブルに?または、この操作をベクトル化する方法はありますか?

答えて

1

あなたはreset_indexstackが必要になります。

df = df.stack().reset_index() 
df.columns = list('ABC') 
df = df[['A','C','B']] 
print (df) 
    A C B 
0 X 1 A 
1 X 2 B 
2 X 3 C 
3 Y 4 A 
4 Y 5 B 
5 Y 6 C 
6 Z 7 A 
7 Z 8 B 
8 Z 9 C 

そしてDataFrame.to_csv

print (df.to_csv(sep='\t', index=None, header=None)) 
X  1  A 
X  2  B 
X  3  C 
Y  4  A 
Y  5  B 
Y  6  C 
Z  7  A 
Z  8  B 
Z  9  C 

df.to_csv('interaction.sif', sep='\t', index=None, header=None) 
1

たぶんあなたが探している機能は、純粋な形であなたの次のような結果が得られますstack です:

df = pd.DataFrame({'A': [1, 4, 7], 'B': [2, 5, 8], 'C':[3, 6, 9]}, index=['X', 'Y', 'Z']) 
df.stack() 

X A 1 
    B 2 
    C 3 
Y A 4 
    B 5 
    C 6 
Z A 7 
    B 8 
    C 9 
dtype: int64 

簡単に下記の使用してCSV形式にエクスポートすることができ比べた:

df.stack().to_csv('sample_unordered.csv', sep='\t') 

しかし、これまでのところ、あなたのための列の順序が重要として、これはもう少しデータ操作が必要になります:

df1 = df.stack().reset_index() 
df1.loc[:, ['level_0', 0 ,'level_1']].to_csv('sample_ordered.csv', sep='\t', header=False, index=False) 

代替ソリューションですmelt関数を使用してください:

df2 = pd.melt(df.reset_index(1), id_vars=['index'], value_vars=['A', 'B', 'C']).sort_values('index') 
df2[['index', 'value', 'variable']].to_csv('sample_melt.csv', sep='\t', header=False, index=False)