将 pandas 数据框导出为交互文件:row \t value \t col
Export pandas dataframe as an interaction file: row \t value \t col
使用以下 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 或 table 的数据框方法,例如,以上述格式?或者有没有办法向量化这个操作?
你需要stack
with 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
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)
您要查找的函数很可能是 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)
使用以下 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 或 table 的数据框方法,例如,以上述格式?或者有没有办法向量化这个操作?
你需要stack
with 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
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)
您要查找的函数很可能是 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)