Python 在相同形状的两个数据帧之间查找较大的行

Python 在相同形状的两个数据帧之间查找较大的行,python,pandas,Python,Pandas,我有两个相同形状的数据帧,我试图找到dfa中的所有行,其中每个值都大于dfb中对应的行 小型示例: 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在大多数情况下都让我受益匪浅,但我就是不知道如何只返回那些所有内容都是真实的

我有两个相同形状的数据帧,我试图找到dfa中的所有行,其中每个值都大于dfb中对应的行

小型示例:

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
在大多数情况下都让我受益匪浅,但我就是不知道如何只返回那些所有内容都是
真实的行


(我尝试将两者合并,但这似乎并没有让它变得更简单。)

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')

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')
输出为:

   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
Pythons
max
解释
True
False
,因此在行方向上应用
min
(这就是为什么我使用
axis=1
)仅在行中的两个值都是
True
时计算
True

0     True
1    False
2    False
这现在是一个布尔索引,用于从
df_a
resp提取行<代码>df_B

df_A.loc[(df_A > df_B).all(axis=1)]
输出为:

   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
Pythons
max
解释
True
False
,因此在行方向上应用
min
(这就是为什么我使用
axis=1
)仅在行中的两个值都是
True
时计算
True

0     True
1    False
2    False

这现在是一个布尔索引,用于从
df_a
resp提取行
df_B

如果您感兴趣,可以用一行代码完成

df_A.loc[(df_A > df_B).all(axis=1)]
df_A[(df_A > df_B)].dropna(axis=0, how='any')
这里
df_A[(df_A>df_B)]
在匹配真假值或
na
后给出输出

    one   two
0  20.0  11.0
1   NaN   9.0
2   NaN   NaN

然后,如果至少有
任何
不是数值,我们可以沿0
轴删除na值。

如果您感兴趣,可以在一行代码中完成

df_A[(df_A > df_B)].dropna(axis=0, how='any')
这里
df_A[(df_A>df_B)]
在匹配真假值或
na
后给出输出

    one   two
0  20.0  11.0
1   NaN   9.0
2   NaN   NaN

然后,如果至少有
任何
不是数值,我们可以沿着0
轴放置na值。

您还可以为示例添加预期输出吗?编辑问题您还可以为示例添加预期输出吗?编辑问题这很有趣,你能详细解释一下为什么
min
只返回所有的真行吗?既然
True>false
min(True,false)
false
min(false,True)
也是
false
min(True,True)
True
,对吗。因此(对于那些花了更长时间研究这个问题的人来说),它只对每个值都为真的行返回
True
;使用此作为索引只返回
df_A>df_B
对每一列都为真的行。这很有趣,您能详细说明一下为什么
min
只返回所有真行吗?既然
True>false
min(True,false)
false
min(false,True)
也是
false
min(True,True)
True
,对吗。因此(对于那些花了更长时间研究这个问题的人来说),它只对每个值都为真的行返回
True
;使用此作为索引只返回
df_A>df_B
对每列都为真的行。谢谢!在列轴上使用1 in
all(1)
就是我缺少的!使用列轴的
all(1)
中的1是我遗漏的东西回答不错!有人建议的另一个单行线是
df_A.loc[(df_A>df_B).all(axis=1)]
Yes!我也更喜欢那个。回答得好!有人建议的另一个单行线是
df_A.loc[(df_A>df_B).all(axis=1)]
Yes!我也更喜欢那个。