如何搜索行以检查行是否包含值并仅提取该特定列

时间:2019-04-03 08:30:07

标签: python pandas dataframe

我试图遍历数据帧的行以搜索值是否为TRUE。数据框如下所示:

Mass    900.5    901.5    902.5    1000.5    1001.5   
Height  100      200      300      400       500
mass
901.4  FALSE     TRUE     FALSE    FALSE     FALSE
903.5  FALSE     FALSE    FALSE    FALSE     FALSE
1001.4 FALSE     FALSE    FALSE    FALSE     TRUE

如您所见,一行可能具有“ TRUE”或仅具有“ FALSE”。我想在质量之后遍历第一列的行,并搜索行是否不具有“ TRUE”。如果某行不具有“ TRUE”,那么我想将该特定行的值分配为空白(我相信等同于python中的None)。我当前的代码提取“ TRUE”值并收集相应的Height值。

例如,使用我的代码后,上述数据框将产生:

当前结果:

Mass    Height
901.4   200
1001.4  500

代码1:

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

仅供参考,代码1是最初定义df的地方。

代码2:

for index, exp_mass, intensity in df.itertuples():
    matches[exp_mass] = abs(matches.index - exp_mass)/matches.index < ppm/1e6

上一行是在根据ppm公差拾取值之后创建示例数据框的内容。

代码3:

list = matches.any().reset_index(name='a')[matches.any().values]

以上是我认为提取质量和高度值(当前结果表)的内容。

我尝试使用if / iloc和其他命令查看是否可以将None分配给特定行,但是没有用。预期结果应该是:

列表:

Mass    Height
901.4   200
903.5   
1001.4  500

(编辑1) 我尝试使用第一个答案的建议,它给我的感觉是:

    Height
0   TRUE
1   TRUE
2   TRUE

也许数据框的格式不同。也没有False或NaN值。请注意,“高度”行和“ 901.4”行之间有一个空行。

(编辑2) 尝试使用第二个答案中的建议,它给了我:

    Mass    Height
0   901.4   (901.4, 200)
1   903.5   (903.5, 518)
2   1001.4  (1001.4, 500)

索引1行的高度值应该为空,但由于某种原因获得了随机值。通过查看进入匹配数据帧的导入数据,该518值似乎是该数据的第一个Height值。

送入匹配数据帧的原始数据如下:

Mass    Height
899.1   518
900.5   100
901.5   200
902.5   300
950.5   400
1000.5  400
1001.5  500

等等。

2 个答案:

答案 0 :(得分:0)

您可以执行以下操作,虽然这不是一种很干净的方法,但是会为您工作。

我会像您的结果一样创建一个df:

    import pandas as pd
    df = pd.DataFrame(index = [901.4, 903.5, 1001.4],
                      columns=[100, 200, 300, 400, 500],
                      data=[[False, True, False, False, False],
                            [False, False, False, False, False],
                            [False, False, False, False, True]])
   df.index.name = 'mass'
   df.columns.name = 'Height'

在这里,我将传递所有行,并使用正确的格式创建一个新的df:

    import numpy as np

    new_df = pd.DataFrame(columns = ['Height'])
    for index, row in df.iterrows():
        if not row.any():
            new_df.loc[index, 'Height'] = np.nan
        else:
            new_df.loc[index, 'Height'] = row.any()

希望对您有帮助!

答案 1 :(得分:0)

如果想要第一个True值(如果存在),否则NaN首先删除DataFrame.droplevelMultiIndex的第一级,然后添加名称为NaN的新列将仅与False的行匹配,最后将DataFrame.idxmax用于每行的前True列:

df1 = df.droplevel(0, axis=1)
df1[np.nan] = True
df2 = df1.idxmax(axis=1).rename_axis('Mass').reset_index(name='Height')
print (df2)
     Mass Height
0   901.4    200
1   903.5    NaN
2  1001.4    500