python根据值获得对应的建,Python-根据值或条件列表提取数据

我有一个包含9列的数据集,并且我设法使用了pandas提取了其中的两列(感谢Stack Object之前的帮助!)。现在,我的问题是:我有一个值列表,这些值将用于从数据集中提取并提取相应的值。提取的数据集如下所示:

Exp. m/z Intensity

1000 2000

2000 3000

3000 4000

4000 5000

等等(每个数据集大约有500多行)。用于取件的列表如下:

mass

1200

1300

依此类推(提取清单大约200行)。每个质量值将用于计算上下仓,它们将用于提取Exp。数据集中的m / z值。因此,例如,质量1200将被计算为1250(上部)和1150(下部),并且从数据集中落入此范围内的任何东西都会被拾取,并且它们对应的强度值正是我想要的。如果没有选择,我希望结果尽可能为空值,因为我认为0值会影响平均值和其他统计分析。

下面是我的代码,其中file是数据集,而pickupfile是拾取列表:

从熊猫导入DataFrame

import pandas as pd

import numpy as np

file = 'C09.xls'

pickupfile = 'pickuplist.xlsx'

xl = pd.ExcelFile(file)

pl = pd.ExcelFile(pickupfile)

plist = pd.read_excel(xl)

pickuplist = pd.read_excel(pl)

cmass = plist['Exp. m/z']

height = plist['Intensity']

plistcollect = pd.concat([cmass, height], axis=1)

ppm = 150

peak1upper = round(pickuplist*(1+ppm/1000000),4)

peak1lower = round(pickuplist*(1-ppm/1000000),4)

pickup = plistcollect[((plistcollect['Exp. m/z']>peak1lower) & (plistcollect['Exp. m/z'] < peak1upper))]

print(pickup['Intensity'])

当我执行此代码时,我收到一条错误消息:ValueError:条件而不是float64所期望的布尔数组。我确实了解我的数据集是浮动值,所以你们有一些提示或技巧/建议吗?

非常感谢!!

编辑:忘记提及我的数据和两个限制(peak1lower和peak1upper)是float64类型。

我也尝试过使用isin的皮卡,例如:

pickup = plistcollect[plistcollect.isin(np.arange(peak1lower,peak1upper))]

解决方案

一种解决方案是使用从领取列表中的值作为索引,并从plist中的值创建新的DataFrame

matches = pd.DataFrame(index=pickup['mass'], columns = plist.set_index(list(plist.columns)).index, dtype=bool)

然后,例如,如果您离目标仅150ppm,而无法abs进行此双向比较,则根据需要填充此DataFrame

ppm = 150

for index, exp_mass, intensity in plist.itertuples():

matches[exp_mass] = abs(matches.index - exp_mass) / matches.index < ppm / 1e6

这给出了这样的东西

Exp. m/z 1000 2000 3000 4000

Intensity 2000 3000 4000 5000

mass

1000 True False False False

1200 False False False False

1300 False False False False

您可以轻松地通过dict理解来浓缩

results = {i: list(s.index[s]) for i, s in matches.iterrows()}

它以元组的形式为pickuplist所有匹配项中的每一行返回一个dict条目,像这样plist的元组(Exp. m/z, Intensity)

{1000: [(1000, 2000)], 1200: [], 1300: []}

如果只想要(Exp. m/z, Intensity)元组,则可以这样做

results2 = {key for key, value in matches.any().iteritems() if value}

这给这个set

{(1000, 2000)}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值