如何从一个文本文件中将值组合在一起,并使用pandas将结果输出到单独的文件?

时间:2017-08-25 21:05:33

标签: python pandas dataframe

我有一个名为text.txt的文件,如下所示:

type    iAtm    clust   prob    atoms         peak      pkppms
rbclust    0        5   0.84433 7.H2 8.H1' 7.67414 5.36287             pk5      7.85335 5.23688
rbclust    1        2   0.87237 7.H2 22.H1' 7.67414 5.59257            pk2      7.85285 5.52444
rbclust    2        3   0.96186 9.H2 10.H1' 7.43359 5.37814            pk3      7.45819 5.42587
rbclust    3        0   0.98187 9.H2 19.H1' 7.43359 5.69108            pk0      7.45766 5.68094
rbclust    4        4   0.78836 20.H2 8.H1' 7.60157 5.36287            pk4      7.89775 5.23989
rbclust    5        1   0.88374 21.H2 22.H1' 7.95925 5.59257           pk1      8.11276 5.52142

我想从atom列中获取一对原子的值。例如,在第一行中,atom列中的值为7.H2 8.H1',我希望将它们与最后两列中的列相匹配。例如,我希望第一行(不包括标题)的示例输出看起来像这样:

7.H2 7.85335
8.H1' 5.23688

我希望我的最终输出看起来像这样:

7.H2 7.85335
8.H1' 5.23688
7.H2 7.85285
22.H1' 5.52444
9.H2 7.45819
10.H1' 5.42587
9.H2 7.45766
19.H1' 5.68094
20.H2 7.89775
8.H1' 5.23989
21.H2 8.11276
22.H1' 5.52142

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

import pandas as pd
import os
import sys

filename = 'text.txt'
match_file = sys.argv[1]

df = pd.read_csv(filename, sep = r'\s+')
df = df.ix[:. ['Atom','avgppm']]

match = pd.read_csv(match_file, sep = r'\s+', header = None, names = ('Atom', 'exp_ppm'))

我很困惑如何使用pandas将每个原子与每个值匹配,我该如何正确匹配?

编辑:

None None
None None
None None
None None
None None
None None 
None None
None None
None None
None None
None None
None None

2 个答案:

答案 0 :(得分:2)

您的输入数据是否真的格式化了?

如果是这样,指定所有列可以更容易阅读。

df = pd.read_csv(r'C:\sample_data\output\test.txt', sep=r'\s+', 
                 names=['type', 'iAtm', 'clust', 'prob', 'atom1','atom2',
                        'peak1', 'peak2', 'pkppms', 'match1', 'match2'],
                 skiprows=1, dtype=str)

添加cols,concat,sort和write csv:

 pd.concat([(df.atom1 + ' ' + df.match1),
            (df.atom2 + ' ' + df.match2)]).sort_index().to_csv('out.txt', index=False)

答案 1 :(得分:0)

这是一种方法,使用zip()

zipped = zip(df.atoms.str.split(), df[["val1", "val2"]].values)
tmp = np.array([((a, val1), (b, val2)) for ((a, b), (val1, val2)) in zipped])
paired = []
for a, b in tmp:
    paired.append(a)
    paired.append(b)
pd.Series(paired)

0       [7.H2, 7.85335]
1      [8.H1', 5.23688]
2       [7.H2, 7.85285]
3     [22.H1', 5.52444]
4       [9.H2, 7.45819]
5     [10.H1', 5.42587]
6       [9.H2, 7.45766]
7     [19.H1', 5.68094]
8      [20.H2, 7.89775]
9      [8.H1', 5.23989]
10     [21.H2, 8.11276]
11    [22.H1', 5.52142]
dtype: object

如果您确实需要字符串而不是值列表(例如9.H2 7.45819而不是[9.H2, 7.45819]),请将append()行更改为:

paired.append(' '.join(a))
paired.append(' '.join(b))