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

Python 如何将一个文本文件中的值配对在一起,并使用pandas将结果输出到单独的文件?,python,pandas,dataframe,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

我有一个名为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
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
我想从原子对的
atom
列中获取值。例如,在第一行中,atom列中的值是
7.H2 8.H1'
,我想将它们与最后两列中的列相匹配。例如,我希望第一行(不包括标题)的示例输出如下所示:

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
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
我希望我的最终输出如下所示:

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
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

这里有一种方法,使用
zip()

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

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

这里有一种方法,使用
zip()

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

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

您的输入数据真的是这样格式化的吗

如果是这样,那么指定所有列将使其更易于阅读

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、排序和写入csv:

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

您的输入数据真的是这样格式化的吗

如果是这样,那么指定所有列将使其更易于阅读

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、排序和写入csv:

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

嗨,谢谢你!我试图实现这个cod,但我得到了一个错误:属性错误:“DataFrame”对象没有属性“atoms”My
df是df=pd.read\u csv('text.txt',sep=r'/s+')
,我正在将它写入这样的文件:
df.to\u csv('out.txt',index=False)
您的示例数据有一个名为
atoms
的列。我添加了
val1
val2
列名,因为您没有为最后两个字段指定列名。检查
read\u csv()
之后的
df.columns
。它与示例数据中的列匹配吗?嗨,谢谢!我试图实现这个cod,但我得到了一个错误:属性错误:“DataFrame”对象没有属性“atoms”My
df是df=pd.read\u csv('text.txt',sep=r'/s+')
,我正在将它写入这样的文件:
df.to\u csv('out.txt',index=False)
您的示例数据有一个名为
atoms
的列。我添加了
val1
val2
列名,因为您没有为最后两个字段指定列名。检查
read\u csv()
之后的
df.columns
。它与示例数据中的列匹配吗?我尝试了它,在
pd.concat([df.atom1+''+df.match1),(df.atom2+'+df.match2)])行中得到一个错误,上面写着
SyntaxError:invalid syntax
您缺少了一个“(“df.atom1”之前)”。抱歉,我修复了它,它运行正常,但当我查看输出时,它所说的是:
None
None
None
None
。。抱歉,我将编辑问题,以便您可以看到'out.txt'文件的样子。您是否像在我的示例中那样读取了它?生成的df应该有一个0:len-1索引,nt在test.text中使用任何col。我尝试了它,我得到一个错误,在
pd.concat([df.atom1+''+df.match1),(df.atom2+'+df.match2)])行上显示
SyntaxError:invalid syntax
您缺少了一个“(“df.atom1”之前)”)。sort_index().to_csv('out.txt',index=False)
。抱歉,我修复了它,它运行正常,但当我查看输出时,它所说的是:
None
None
None
None
。。抱歉,我将编辑问题,以便您可以看到'out.txt'文件的样子。您是否像在我的示例中那样读取了它?生成的df应该有一个0:len-1索引,not使用test.text中的任何COL。