如果某些值相等,我怎样才能将一个文本文件中的值替换为另一个文本文件中的其他值?

时间:2017-08-07 20:04:04

标签: python pandas dataframe

我有一个名为finalscores.txt的文件,我想创建一个python脚本,它将打开它并从两个单独的列中读取值。

这是我的finalscores.txt文件

     Atom nVa  predppm   avgppm    stdev    delta    QPred   QMulti   qTotal
  7.H2   2    7.674    7.853    0.000    0.000    0.968    1.000    0.993
  9.H2   2    7.434    7.458    0.000    0.001    0.996    1.000    0.999
 20.H2   1    7.602    7.898    0.000    0.000    0.945    1.000    0.982
 21.H2   1    7.959    8.113    0.000    0.000    0.972    1.000    0.991
 8.H1'   2    5.363    5.238    0.002    0.003    0.978    0.997    0.993
22.H1'   2    5.593    5.523    0.002    0.003    0.988    0.997    0.995
10.H1'   1    5.378    5.426    0.000    0.000    0.992    1.000    0.997
19.H1'   1    5.691    5.681    0.000    0.000    0.998    1.000    0.999
score: 0.9941270604681679

我想要接受的值来自第一个,#34; Atom"专栏,第四个" avgppm"列。我不想接受第一行:

Atom nVa predppm avgppm stdev delta QPred QMulti qTotal

或最后一行: score: 0.9941270604681679

我有另一个名为pinkH1_ppm.txt的文件,我想打开它并附加它。这就是我pinkH1_ppm.txt的样子:

2.H8 7.61004 0.3
1.H8 8.13712 0.3
3.H6 7.53261 0.3
4.H8 7.49932 0.3
5.H6 7.72158 0.3
7.H8 8.16859 0.3
6.H6 7.70272 0.3
9.H8 8.1053 0.3
8.H6 7.65014 0.3
10.H6 7.5231 0.3
11.H6 7.58213 0.3
12.H6 7.72805 0.3
13.H6 8.02977 0.3
14.H6 7.69624 0.3
15.H8 7.82994 0.3
17.H8 7.24899 0.3
18.H6 7.6439 0.3
20.H8 7.78512 0.3
19.H8 7.65501 0.3
22.H8 7.47677 0.3
23.H6 7.7306 0.3
24.H6 7.80104 0.3
25.H8 7.67295 0.3
26.H6 7.67463 0.3
27.H6 7.64807 0.3
1.H1' 5.8202 0.3
2.H1' 5.90291 0.3
4.H1' 5.74125 0.3
3.H1' 5.54935 0.3
6.H1' 5.54297 0.3
8.H1' 5.36287 0.3
11.H1' 5.50093 0.3
10.H1' 5.37814 0.3
14.H1' 5.96177 0.3
15.H1' 5.959 0.3
17.H1' 5.75214 0.3
19.H1' 5.69108 0.3
22.H1' 5.59257 0.3
24.H1' 5.55313 0.3
25.H1' 5.70819 0.3
27.H1' 5.74236 0.3
26.H1' 5.48061 0.3

我想检查" Atom列中是否有任何值"在我的finalscores.txt中,匹配pinkH1_ppm.txt第一列中的所有值,如果匹配,我想将pinkH1_ppm.txt中的第二列替换为我finalscores.txt中该Atom的值1}}文件。

例如,在finalscores.txt,19.H1'是pinkH1_ppm.txt中也可以找到的Atom,所以我想替换pinkH1_ppm.txt的第二列中的值,该值也对应于19.H1',其为5.69108,含5.681。

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

import pandas as pd
import os
import sys
import re 

filename = 'finalscore.txt'
ppmColor = 'pinkH1_ppm.txt'

df = pd.read_cv(filename,sep = " ", skiprows = 1)

col1 = df["Atom"]
col2 = df["avgppm"]

df2 = pd.read_cv(ppmColor,sep = " ", skiprows=0)
name = df2[0]
ppm = df2[1]
with open(ppmColor, "a") as ppmAppend:
    for line in ppmAppend
        if col1 == name: 

我试图使用大熊猫。我对第二个数据帧df2非常不确定,因为ppmColor文件中没有标题,我想从第一行开始读取它。我认为使用大熊猫是最好的主意,但我不确定如何准确地接近它。

错误: replaceppm.py:10: ParserWarning: Falling back to the 'python' engine because the 'c' engine does not support skipfooter; you can avoid this warning by specifying engine='python'.

df=pd.read_csv('finalscore.txt',sep=r'\s+',skipfooter=1)

Traceback (most recent call last):

File"replaceppm.py", line 18, in <module>

pink.set_index("Atom",inplace=True)

NameError: name 'pink' is not defined

1 个答案:

答案 0 :(得分:2)

如果你把两个csvs读成pandas DataFrame个对象,那么用第一个值来更新第二个csv是一个问题。 update方法要求两个数据帧具有相似的索引。

import pandas as pd                                                                                                                                                                 

df = pd.read_csv('finalscores.csv', sep=r'\s+', engine='python', skipfooter=1)                                                                                                                   
df = df.ix[:, ['Atom', 'avgppm']]                                                                                                                                                   
pink = pd.read_csv('pinkH1_ppm.txt', sep=r'\s+', header=None, names=('Atom', 'avgppm', 'x'))                                                                                               

df.set_index('Atom', inplace=True)                                                                                                                                                  
pink.set_index('Atom', inplace=True)                                                                                                                                                
pink.update(df)