我的代码的功能是从已知值中提取一定公差(100 ppm公差)内的值。
要提取的数据如下:
col1 col2
1000 10000
1050 20000
2000 30000
,依此类推(最多400行)。以下是从拾取列表中拾取的代码部分(类似于col1的值):
for files in file_list:
df = pd.read_csv(files, engine='python')
matches = pd.DataFrame(index=pickuplist['mass'],
columns=df.set_index(list(df.columns)).index,
dtype=bool)
for index, exp_mass, intensity in df.itertuples():
matches[exp_mass] = abs(matches.index - exp_mass)/matches.index < ppm/1e6
if (len(matches[exp_mass])== 0):
matches[exp_mass] = None
results3 = matches.any().reset_index(name='a')[matches.any().values]
每个文件的结构类似于上面显示的示例表(col1,col2和一个空列)。取件清单如下:
col1
1000.04
1050.02
2000.04
当前代码在运行时会提取所需值并将其输出为:
col1 col2
1000.04 10000
1050.02 20000
2000.04 30000
但是,如果没有人捡拾,我想留空。例如,如果一个拾取列表包含col1中的值1647.58,并且数据中的100 ppm公差在1647.58的范围内,则没有任何内容,则该1647.58的匹配数据帧将为空白:
col1 col2
1000.04 10000
1050.02 20000
2000.04 30000
if (len(matches[exp_mass])== 0):
matches[exp_mass] = None
我认为以上部分可以解决问题,但我想我错了。任何建议,将不胜感激。谢谢!
答案 0 :(得分:1)
我认为正在发生的事情是您在迭代时尝试在python中更新变量。这在python中是不可能的,请检查this以获得解释,但请简化为您有这段代码
import pandas as pd
import numpy as np
df = pd.DataFrame(np.array([[1000.04, 1000], [1050.02, 2000], [2000.04, 3000]]), columns=('col1', 'col2'))
for index, row in df.iterrows():
if row['col1'] == 1000.04:
row['col1'] == np.nan
print(df)
您会认为这会更改第一行的值,但是如果执行它,您会发现不会发生。 为了更改数据框,您需要进行如下更改:
df.loc[df['col1'] == 1000.04, ['col1', 'col2']] = np.nan
print(df)