Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/280.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python-基于值或条件列表的拾取数据_Python_Pandas - Fatal编程技术网

Python-基于值或条件列表的拾取数据

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

我有一个有9列的数据集,我使用pandas成功地提取了其中的两列(感谢堆栈成员之前的帮助!)。现在,我的问题是:我有一个值列表,用于从数据集中提取相应的值。提取的数据集如下所示:

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:条件应为布尔数组,