我有一个数据框(df),其中包含几个列,其中包含实际测量值和相应的列数(A,B,...),每列都有不确定性(dA,dB,...): / p>
A B dA dB
0 -1 3 0.31 0.08
1 2 -4 0.263 0.357
2 5 5 0.382 0.397
3 -4 -0.5 0.33 0.115
我应用一个函数来根据我的定义
在测量列中查找有效的值df[["A","B"]].apply(lambda x: x.abs()-5*df['d'+x.name] > 0)
这将返回一个布尔数组:
A B
0 False True
1 True True
2 True True
3 True False
我想使用此数组来选择数据帧中的行,其中条件在单个列中为真,例如 A - >行 1-3 ,并且还查找所有输入列的条件为真的行,例如行 1 和 2 。 有没有一种有效的方法来做大熊猫?
答案 0 :(得分:2)
您可以将apply语句的结果用于从原始数据框中选择布尔索引:
results = df[["A","B"]].apply(lambda x: x.abs()-5*df['d'+x.name] > 0)
返回上面的布尔数组:
A B
0 False True
1 True True
2 True True
3 True False
现在,您可以使用此数组从原始数据名称中选择行,如下所示:
选择A为真的位置:
df[results.A]
A B dA dB
1 2 -4.0 0.263 0.357
2 5 5.0 0.382 0.397
3 -4 -0.5 0.330 0.115
选择A或B为真的位置:
df[results.any(axis=1)]
A B dA dB
0 -1 3.0 0.310 0.080
1 2 -4.0 0.263 0.357
2 5 5.0 0.382 0.397
3 -4 -0.5 0.330 0.115
选择所有列为true的位置:
df[results.all(axis=1)]
A B dA dB
1 2 -4.0 0.263 0.357
2 5 5.0 0.382 0.397
答案 1 :(得分:1)
使用底层数组数据,矢量化方法就是这样 -
cols = ['A','B'] # list holding relevant column names
dcols = ['d'+i for i in cols]
out = np.abs(df[cols].values) - 5*df[dcols].values > 0
示例运行 -
In [279]: df
Out[279]:
A B dA dB
0 -1 3.0 0.310 0.080
1 2 -4.0 0.263 0.357
2 5 5.0 0.382 0.397
3 -4 -0.5 0.330 0.115
In [280]: cols = ['A','B'] # list holding relevant column names
...: dcols = ['d'+i for i in cols]
...: out = np.abs(df[cols].values) - 5*df[dcols].values > 0
...:
In [281]: out
Out[281]:
array([[False, True],
[ True, True],
[ True, True],
[ True, False]], dtype=bool)
要通过将无效的设置为NaNs
来提取有效的,我们可以使用np.where
-
In [293]: df[cols] = np.where(out, df[cols], np.nan)
In [294]: df
Out[294]:
A B dA dB
0 NaN 3.0 0.310 0.080
1 2.0 -4.0 0.263 0.357
2 5.0 5.0 0.382 0.397
3 -4.0 NaN 0.330 0.115
此外,我们可以获得所有匹配的行,每行减少all()
-
In [283]: np.flatnonzero(out.all(axis=1))
Out[283]: array([1, 2])