我有一个像小例子一样用制表符分隔的文件,并试图从中创建一个新的文本文件。
小例子:
x y1 y2 y3
a1 1 5 4
a2 3 6 9
a3 7 8 5
在输出文件中,我将有2列。第一列包含输入文件的标题(从第二列到末尾),它们重复n次(n =输入文件中的行数)。输出文件中的第二列是整列(标头除外),这意味着第三列在第二列之下,第四列在第三列之下,并且它们都在其标头(输入文件标头)之前< / p>
预期输出:
YY XX
y1 1
y1 3
y1 7
y2 5
y2 6
y2 8
y3 4
y3 9
y3 5
我在python3中做了以下函数,但没有返回预期的输出。你知道如何解决吗?
def summ(infile, outfile):
with open(infile, 'r') as f:
res = {}
line = f.split()
res.keys = line[1]
res.values = line[2:]
of = open(outfile, "w")
for k, v in res.items():
of.write(str(k) + '\t'+ str(v) + '\n')
答案 0 :(得分:1)
使用pandas
和numpy
可以按以下方式重写:
import pandas as pd
import numpy as np
def summ(infile, outfile):
df = pd.read_csv(infile, index_col=0, delimiter="\t")
df2 = pd.DataFrame(np.concatenate([df[col].values for col in df.columns]), index=np.repeat(df.index.values, df.shape[0]), columns=['YY'])
df2.index.names = ['XX']
df2.to_csv(outfile, sep='\t')
答案 1 :(得分:0)
首先,我会使用熊猫。因为它为您进行了解析,并为您提供了一种处理数据的好方法。
import pandas as pd
#Read your file, i suppose in fileName
dataFile = pd.read_csv(fileName,sep=" ")
#Now we do what is asked by concatenating each columbine after the other
dfOutput=pd.DataFrame()
tmpDict={}
tmpDict["XX"]=[]
tmpDict["YY"]=[]
for col in dataFile.columns:
tmpDict["YY"]=[col]*len(dataFile)
tmpDict["XX"]=dataFile[col]
dfOutput=pd.concat([dfOutput,pd.DataFrame(tmpDict)])
dfOutput.to_csv(output,sep=" ",index=False)
我认为可以优化:D。如果您真的需要一种不用熊猫的方法,请告诉我。
答案 2 :(得分:0)
您没有编写足够的代码来解决此问题。如果您对使用像 csv 和 pandas 这样可以帮助您处理表格数据的库不感兴趣,则可以扩展当前代码来解决问题:
from collections import defaultdict
def summ(infile, outfile):
res = defaultdict(list)
with open(infile) as inf:
_, *keys = inf.readline().split()
for line in inf:
for i, value in enumerate(line.split()[1:]):
res[keys[i]].append(value)
with open(outfile, 'w') as outf:
outf.write("YY\tXX\n")
for key, values in res.items():
for value in values:
outf.write(key + "\t" + value + "\n")