【问题标题】:How to search rows in order to check if the row contains a value and only extract that specific column如何搜索行以检查该行是否包含值并仅提取该特定列
【发布时间】:2019-08-24 17:00:34
【问题描述】:

我正在尝试遍历数据框的行以搜索值是否为 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)。我当前的代码提取“真”值并收集相应的高度值。

例如,上面的数据框在使用我的代码后会产生:

当前结果:

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 值似乎是数据的第一个高度值。

输入匹配数据框的原始数据如下所示:

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

等等。

【问题讨论】:

  • 如果每行有多个Trues 会怎样?
  • 每行不应有多个 True,因为每行可以没有或只有一个质量拾取值。

标签: python pandas dataframe


【解决方案1】:

您可以执行以下操作,这不是一个真正干净的方式,但它会为您工作。

我创建了一个像你的结果一样的 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()

希望对你有帮助!

【讨论】:

  • 我尝试了你的建议。请参阅我的帖子的 Edit1 以获取更新。谢谢!
【解决方案2】:

如果想要第一个 True 值(如果存在),否则 NaN 首先通过 DataFrame.droplevel 删除 MultiIndex 的第一级,然后添加名称为 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

【讨论】:

  • 尝试了您的建议。请参阅我帖子的 Edit2 以获取更新。
  • @BongKyoSeo - 似乎只使用df1.idxmax(axis=1),然后在输出中获取元组。
猜你喜欢
  • 2013-08-04
  • 2019-10-03
  • 1970-01-01
  • 2015-01-26
  • 2013-02-10
  • 1970-01-01
  • 1970-01-01
  • 2020-05-24
  • 1970-01-01
相关资源
最近更新 更多