0

我对python相当陌生,我需要执行一些数据处理。我想要一些关于最佳实践的建议:库、模块、更好的实现代码,或者只是方向。

所以我有一个文本文件,其中的数据按以下格式组织:

A:100 B:200 C:300

A:150 B:350 C:370

即每一行代表相关数据,3个变量,命名为A/B/C。每个新行显示有关相同变量但与另一个对象相关的数据。

所以我的数据在一个文本文件中,我想以以下格式输出:

100 '\t' 150

200 '\t' 350

300 '\t' 370

即变量 A、B 和 C 的数据行,制成表格,以便我可以导出到图形工具包(可能是 Origin Pro)。

这是我到目前为止提出的代码:

with open("example.txt", 'r') as file:
    for line in file.readlines():
        line = line.replace(' ', '\n')
        line = line.split(':',  1)[-1]
        print line

这会将数据转换为以下内容:

100
B:200
C:300

150
B:350
C:370

由于 .split() 显然只在使用 .replace() 在数据之间添加新行之前在每一行上执行。我觉得在我使用 .replace() 之后,我需要再次开始循环执行 .split() 甚至只是 line[2:] 迭代,以删除前导变量名称 - 但后来我想不出我将如何将每一行的数据制成表格以创建列?

有任何想法吗?谢谢!

4

3 回答 3

0

显然,您需要一些数据结构来保存变量的值。最合适的是列表字典:

d = {'A': [], 'B': [], 'C': []}

然后您浏览文件,将每一行拆分为“名称:值”项目,然后将这些项目拆分在:标志上并适当地存储值:

with open("example.txt", 'r') as file:
    for line in file:
        elements = line.rstrip().split()
        for e in elements:
            (name, value) = e.split(':')
            d[name].append(value)

最后你输出你的数据,每行一个变量:

for k in sorted(d):
    print('\t'.join(d[k]))
于 2017-07-12T11:13:32.297 回答
0

我建议使用pandas库:

import pandas as pd

df = pd.read_csv(path_to_infile, sep=' ', header=None, names=['A', 'B', 'C'])
df = df.applymap(lambda x: int(x[2:]))
df.to_csv(path_to_outfile, sep='\t', header=False, index=False)

之后,import pandas您可以使用read_csv函数将文件加载到数据框中,并带有一些附加参数,例如:

  • sep用于声明分隔符
  • header可用于指示您没有列名
  • names用于为列分配名称

之后,您可以applymap在整个数据帧上使用函数来删除变量名和冒号。

最后,您可以使用to_csv方法将文件保存到所需位置,再次没有header但这次没有index,因为它会默认添加索引列。

如您所见,您可以再次使用sep参数来声明新的分隔符。

于 2017-07-12T11:17:06.227 回答
0

您可以使用pandas来实现,这非常容易:

import pandas as pd

df = pd.read_csv(file_path,sep=' ',header=None,names = ['A','B','C'])
output = df.apply(lambda x:x[.str.replace('^([A-Z]:)','')],axis=1).T
output.to_csv(file_path,sep='\t',header = False, index = False)

文档:

熊猫.apply

pandas.read_csv

pandas.to_csv

于 2017-07-12T11:21:28.680 回答