Найти большую строку между двумя кадрами одинаковой формы - PullRequest
0 голосов
/ 02 сентября 2018

У меня есть два кадра данных одинаковой формы, и я пытаюсь найти все строки в 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 голосов
/ 02 сентября 2018

Это может быть сделано в одной строке кода, если вы заинтересованы.

df_A[(df_A > df_B)].dropna(axis=0, how='any')

Здесь df_A[(df_A > df_B)] дает вывод после сопоставления true false либо значение, либо na.

    one   two
0  20.0  11.0
1   NaN   9.0
2   NaN   NaN

Тогда мы можем отбросить значения na вдоль 0 axis, если есть хотя бы any, а не числовое значение.

0 голосов
/ 02 сентября 2018
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

Pythons max интерпретирует True> False, поэтому применение min для строк (вот почему я использовал axis=1) только вычисляет True, если оба значения в строке True:

0     True
1    False
2    False

Теперь это логический индекс для извлечения строк из df_A соотв. df_B.

0 голосов
/ 02 сентября 2018
df_A.loc[(df_A > df_B).all(axis=1)]
0 голосов
/ 02 сентября 2018

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')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...