Python-基于值或条件列表的拾取数据
我有一个有9列的数据集,我使用pandas成功地提取了其中的两列(感谢堆栈成员之前的帮助!)。现在,我的问题是:我有一个值列表,用于从数据集中提取相应的值。提取的数据集如下所示:Python-基于值或条件列表的拾取数据,python,pandas,Python,Pandas,我有一个有9列的数据集,我使用pandas成功地提取了其中的两列(感谢堆栈成员之前的帮助!)。现在,我的问题是:我有一个值列表,用于从数据集中提取相应的值。提取的数据集如下所示: Exp. m/z Intensity 1000 2000 2000 3000 3000 4000 4000 5000 mass 1200 1300 以此类推(每个数据集大约有500多行)。用于拾取的列表如下所示: Exp. m/z Intensit
Exp. m/z Intensity
1000 2000
2000 3000
3000 4000
4000 5000
mass
1200
1300
以此类推(每个数据集大约有500多行)。用于拾取的列表如下所示:
Exp. m/z Intensity
1000 2000
2000 3000
3000 4000
4000 5000
mass
1200
1300
以此类推(约200行为拾取列表)。每个质量值将用于计算上部和下部料仓,并用于从数据集中获取经验m/z值。例如,质量1200将被计算为1250(上)和1150(下),从数据集中,任何在这个范围内的东西都将被提取,它们相应的强度值就是我想要的。如果没有选择任何值,我希望结果尽可能为空值,因为我相信0值会影响平均值和其他统计分析
下面是我的代码,其中file是数据集,pickupfile是拾取列表:
从导入数据帧
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'])
如果在为数据帧编制索引时有多个条件,则所有条件都必须放在另一个括号内
plistcollect[(plistcollect['Exp. m/z']>peak1lower) & (plistcollect['Exp. m/z'] < peak1upper)]
plistcollect[(plistcollect['Exp.m/z']>peak1lower)和(plistcollect['Exp.m/z']
应该是
plistcollect[((plistcollect['Exp. m/z']>peak1lower) & (plistcollect['Exp. m/z'] < peak1upper))]
plistcollect[(plistcollect['Exp.m/z']>peak1lower)和(plistcollect['Exp.m/z']
编辑:由于需要对每个元素执行编辑,因此必须执行以下操作:
limit_df = pd.DataFrame([peak1lower['Exp. m/z'],peak1upper['Exp. m/z']], index=['lower','upper']).T
filtered_df = limit_df.apply(lambda x: ((plistcollect['Exp. m/z'] > x.lower) & (plistcollect['Exp. m/z'] < x.upper)), axis=1)
limit_df=pd.DataFrame([peak1lower['Exp.m/z'],peak1upper['Exp.m/z'],index=['lower','upper'])。T
过滤后的测向=限制测向应用(λx:((plistcollect['Exp.m/z']>x.lower)和(plistcollect['Exp.m/z']
过滤后的_df将为您提供一个布尔数据框,每一行都有True和False,对应于属于mass list给定元素的数据框条目
更简单的方法是单独保存文件:
def filter_df(x):
plistcollect[((plistcollect['Exp. m/z'] > x.lower) & (plistcollect['Exp. m/z'] < x.upper))].to_csv("test_%s.csv"%x.name)
limit_df.apply(lambda x: filter_df(x), axis=1)
def过滤器_df(x):
plistcollect[((plistcollect['Exp.m/z']>x.lower)和(plistcollect['Exp.m/z']
如果在为数据帧编制索引时有多个条件,则所有条件都必须放在另一个括号内
plistcollect[(plistcollect['Exp. m/z']>peak1lower) & (plistcollect['Exp. m/z'] < peak1upper)]
plistcollect[(plistcollect['Exp.m/z']>peak1lower)和(plistcollect['Exp.m/z']
应该是
plistcollect[((plistcollect['Exp. m/z']>peak1lower) & (plistcollect['Exp. m/z'] < peak1upper))]
plistcollect[(plistcollect['Exp.m/z']>peak1lower)和(plistcollect['Exp.m/z']
编辑:由于需要对每个元素执行编辑,因此必须执行以下操作:
limit_df = pd.DataFrame([peak1lower['Exp. m/z'],peak1upper['Exp. m/z']], index=['lower','upper']).T
filtered_df = limit_df.apply(lambda x: ((plistcollect['Exp. m/z'] > x.lower) & (plistcollect['Exp. m/z'] < x.upper)), axis=1)
limit_df=pd.DataFrame([peak1lower['Exp.m/z'],peak1upper['Exp.m/z'],index=['lower','upper'])。T
过滤后的测向=限制测向应用(λx:((plistcollect['Exp.m/z']>x.lower)和(plistcollect['Exp.m/z']
过滤后的_df将为您提供一个布尔数据框,每一行都有True和False,对应于属于mass list给定元素的数据框条目
更简单的方法是单独保存文件:
def filter_df(x):
plistcollect[((plistcollect['Exp. m/z'] > x.lower) & (plistcollect['Exp. m/z'] < x.upper))].to_csv("test_%s.csv"%x.name)
limit_df.apply(lambda x: filter_df(x), axis=1)
def过滤器_df(x):
plistcollect[((plistcollect['Exp.m/z']>x.lower)和(plistcollect['Exp.m/z']
一种解决方案是创建一个新的数据帧,其中pickuplist中的值作为索引,plist中的值作为列
matches = pd.DataFrame(index=pickup['mass'], columns = plist.set_index(list(plist.columns)).index, dtype=bool)
然后根据需要填充此数据帧,例如,如果距离目标仅150ppm,则可以使用abs
进行此双边比较
ppm = 150
for index, exp_mass, intensity in plist.itertuples():
matches[exp_mass] = abs(matches.index - exp_mass) / matches.index < ppm / 1e6
你可以很容易地用听写理解来浓缩
results = {i: list(s.index[s]) for i, s in matches.iterrows()}
它以元组的形式返回pickuplist
中所有匹配项的plist
中的每一行的dict条目(例如m/z,强度),如下所示
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
{1000: [(1000, 2000)], 1200: [], 1300: []}
如果您只需要(Exp.m/z,Intensity)
元组,可以这样做
results2 = {key for key, value in matches.any().iteritems() if value}
这就给出了这个集合
{(1000, 2000)}
一种解决方案是使用pickuplist中的值作为索引,plist中的值作为列来创建新的数据帧
matches = pd.DataFrame(index=pickup['mass'], columns = plist.set_index(list(plist.columns)).index, dtype=bool)
然后根据需要填充此数据帧,例如,如果距离目标仅150ppm,则可以使用abs
进行此双边比较
ppm = 150
for index, exp_mass, intensity in plist.itertuples():
matches[exp_mass] = abs(matches.index - exp_mass) / matches.index < ppm / 1e6
你可以很容易地用听写理解来浓缩
results = {i: list(s.index[s]) for i, s in matches.iterrows()}
它以元组的形式返回pickuplist
中所有匹配项的plist
中的每一行的dict条目(例如m/z,强度),如下所示
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
{1000: [(1000, 2000)], 1200: [], 1300: []}
如果您只需要(Exp.m/z,Intensity)
元组,可以这样做
results2 = {key for key, value in matches.any().iteritems() if value}
这就给出了这个集合
{(1000, 2000)}
谢谢你的意见。我插入了括号,但它仍然给我相同的错误消息。我还忘了提到peak1upper和peak1lower也是float64类型。错误消息是:ValueError:Boolean数组应用于条件,而不是float64在您发布的此编辑中:pickup=plistcollect[plistcollect.isin(np.arange(peak1lower,peak1upper)),它是否仍然给出相同的错误?Try:plistcollect[plistcollect['Exp.m/z'].isin(np.arange(peak1lower,peak1upper))]现在它说:TypeError:必须是实数,而不是数据帧。我应该用for和if循环来实现这一点吗?我尝试了一个类似的数据集,它很有效。我认为最好的方法是一个接一个地调试它。检查是否执行(plistcollect['Exp.m/z']>peak1lower)或是否给出错误。对于另一种情况也是如此。还可以打印您的系列和限制,以查看一切是否正常。哦,等等。您的peak1lower和peak1upper是数据帧吗?它不应该是一个恒定的浮点值吗?这就是新的错误!谢谢你的意见。我插入了括号,但它仍然给我相同的错误消息。我还忘了提到peak1upper和peak1lower也是float64类型。错误消息为:ValueError:条件应为布尔数组,