我试图遍历数据帧的行以搜索值是否为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
等等。
答案 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.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