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