我有两个形状相同的数据框,并尝试查找df A中的所有行,其中每个值均大于df B中的相应行。
迷你示例:
df_A = pd.DataFrame({'one':[20,7,2],'two':[11,9,1]})
df_B = pd.DataFrame({'one':[1,8,12],'two':[10,5,3]})
我只想返回第0行。
one two
0 20 11
我意识到df_A > df_B
为我提供了大部分帮助,但我只是想不出如何仅返回所有True
的行。
(我尝试将两者合并,但这似乎并没有使其变得简单。)
答案 0 :(得分:3)
IIUIC,您可以使用all
In [633]: m = (df_A > df_B).all(1)
In [634]: m
Out[634]:
0 True
1 False
2 False
dtype: bool
In [635]: df_A[m]
Out[635]:
one two
0 20 11
In [636]: df_B[m]
Out[636]:
one two
0 1 10
In [637]: pd.concat([df_A[m], df_B[m]])
Out[637]:
one two
0 20 11
0 1 10
或者,如果您只需要行索引。
In [642]: m.index[m]
Out[642]: Int64Index([0], dtype='int64')
答案 1 :(得分:1)
import pandas as pd
df_A = pd.DataFrame({"one": [20, 7, 2], "two": [11, 9, 1]})
df_B = pd.DataFrame({"one": [1, 8, 12], "two": [10, 5, 3]})
row_indices = (df_A > df_B).apply(min, axis=1)
print(df_A[row_indices])
print()
print(df_B[row_indices])
输出为:
one two
0 20 11
one two
0 1 10
说明:
df_A > df_B
在元素上进行比较,这是结果:
one two
0 True True
1 False True
2 False False
Python max
解释True
> False
,因此逐行应用min
(这就是我使用axis=1
的原因)仅计算True
如果一行中的两个值均为True
:
0 True
1 False
2 False
这是一个布尔索引,用于从df_A
响应中提取行。 df_B
。
答案 2 :(得分:1)
df_A.loc[(df_A > df_B).all(axis=1)]
答案 3 :(得分:1)
如果您有兴趣,可以用一行代码完成。
df_A[(df_A > df_B)].dropna(axis=0, how='any')
此处df_A[(df_A > df_B)]
在将值或na
与true false匹配后给出输出。
one two
0 20.0 11.0
1 NaN 9.0
2 NaN NaN
然后,如果至少有axis
个数字值,则可以沿0 any
删除na值。