在相同形状的两个数据框之间找到更大的行

时间:2018-09-02 09:09:27

标签: python pandas

我有两个形状相同的数据框,并尝试查找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的行。

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

4 个答案:

答案 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值。