2016-11-09 46 views
1

隨着下面PD數據幀:導出大熊貓數據幀作爲相互作用的文件:行噸值噸COL

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:行標籤,值,列標籤上的交互。下面是一個迭代(幼稚)的方法來編寫這樣的文件:

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)) 

上面的低效的代碼提供了理想的SIF文件數據框df

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

您需要stackreset_index

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)