2016-11-09 7 views
1

:수출은 상호 작용 파일로 dataframe을 판다 : 행 의 t 값 t COL 아래 PD의 dataframe와

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 : 행 레이블, 값, 열 레이블에 대한 상호 작용입니다. 비효율적 인 코드는 위의 dataframe 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 

작성하는 dataframe 방법이 있습니다 아래는 이러한 파일을 작성하는 반복적 인 (순진한) 방식이다 예를 들어, 위의 형식으로 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 
쉽게 내보낼 수 있습니다보다210

아래 사용하여 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)