我有一个名为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
答案 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))