1

使用以下 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 上的交互:行标签、值、列标签。以下是编写此类文件的迭代(和幼稚)方法:

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 或表格,例如,以上述格式?或者有没有办法向量化这个操作?

4

2 回答 2

1

stack需要reset_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)
于 2016-11-09T10:09:56.760 回答
1

您正在寻找的函数很可能是堆栈 ,它以纯形式会给您以下结果:

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)
于 2016-11-09T11:03:15.953 回答