如何使用pandas将单个单元格与python中数据框的整个列进行比较

时间:2019-08-14 22:51:59

标签: pandas dataframe

我收到此错误:“系列的真值不明确。请使用a.empty,a.bool(),a.item(),a.any()或a.all()。”尽管我尽了最大努力检查中间输出(在期望的地方获取布尔值,并且数字是我认为的正确数据类型numpy.float64),但我还在使用按位运算符。

我尝试计算给定列的每个像元(M-1 m / z)大约等于另一列的所有值(观察到的M0 m / z)的次数,然后将该计数写到在称为“ M-1 MSMS存在”的新列中与M-1 m / z对应的行。我已经检查了所有中间输出,并尽我所能检查了一切(参见代码中的#print语句)。我还使用按位运算符来避免持续存在的错误。 if语句似乎是问题所在,到目前为止,我已经拥有了我能想到的一切(包括阅读文档并在堆栈溢出时寻找类似的问题)。还有其他事情暗示着我。感谢您的帮助。

这是我正在使用的csv的缩写版本: enter image description here

代码如下:

    for i in range(len(df)):
#    print('i=', i)
#    print("(df.at[i, 'M-1 m/z'] - (df.at[i, 'M-1 m/z']/10**6)*100)", (df.at[i, 'M-1 m/z'] - (df.at[i, 'M-1 m/z']/10**6)*100))
#    print("df['observed M0 m/z']", (df['observed M0 m/z']))
#    print("bool", (((df.at[i, 'M-1 m/z'] - (df.at[i, 'M-1 m/z']/10**6)*100) <= df['observed M0 m/z']) & ((df.at[i, 'M-1 m/z'] + (df.at[i, 'M-1 m/z']/10**6)*100) >= df['observed M0 m/z'])))
    count = 0
    if (((df.at[i, 'M-1 m/z'] - (df.at[i, 'M-1 m/z']/10**6)*100) <= df['observed M0 m/z']) & ((df.at[i, 'M-1 m/z'] + (df.at[i, 'M-1 m/z']/10**6)*100) >= df['observed M0 m/z'])):
        count += 1
    df.at[i, 'M-1 MSMS existence?'] = count
我希望“ M-1 MSMS存在”列将填充一个数字,该数字与在其他列行中观察到的该数字的次数相对应。如果范围内没有值(如if语句所示),则为0;如果存在3行,其中“ m-1 m / z”和“观察到的M0 m / z”相同,则为3。

1 个答案:

答案 0 :(得分:0)

我相信解决方案是:

for i in range(len(df)): #include RT too
counter = 0
counter = np.count_nonzero(((df.at[i, 'M-1 m/z'] - (df.at[i, 'M-1 m/z']/10**6)*100) <= df['observed M0 m/z']) & ((df.at[i, 'M-1 m/z'] + (df.at[i, 'M-1 m/z']/10**6)*100) >= df['observed M0 m/z'])) 
df.at[i, 'M-1 MSMS existence?'] = counter

我认为问题在于if语句不能接受布尔值列表。因此,我们只将真实数计为1并使用该数字。