Как я могу найти логический индекс фрейма данных Pandas, который соответствует известному подмножеству данных? - PullRequest
0 голосов
/ 20 сентября 2019

У меня есть фрейм данных с несколькими столбцами целых чисел, скажем, они помечены A - E.Я заинтересован в поиске столбцов, где D < E на основе отношений между A, B и C.Я подозреваю, что отношения похожи на D < E if (A < B) & (B > C).Моя цель состоит в том, чтобы предсказать, является ли D < E истинным, учитывая только A, B и C.

. Мне также интересен теоретический подход, и я понимаю, что это выходит за рамки Pythonвопрос, но любая помощь будет оценена.

Ответы [ 2 ]

1 голос
/ 20 сентября 2019

Вы можете замаскировать фрейм данных pandas с помощью логического выражения и проверить несколько вещей, чтобы оценить связь между A, B, C, D и E. Однако мой пример основан на случайном числе.Но это должно дать вам направление.

import pandas as pd
import numpy as np 

data = np.random.randint(0,10,(5,5))

df = pd.DataFrame(data, columns=["A", "B", "C", "D", "E"]) 

# filtering data on index value 
mask = (df.D < df.E) & (df.A < df.B) & (df.B > df.C) 

print(df)

#    A  B  C  D  E
# 0  1  7  7  9  0
# 1  4  9  3  0  3
# 2  3  4  1  1  6
# 3  2  1  4  3  5
# 4  8  8  2  3  6

print(mask)

# 0    False
# 1     True
# 2     True
# 3    False
# 4    False
# dtype: bool

print(df[mask])

#    A  B  C  D  E
# 1  4  9  3  0  3
# 2  3  4  1  1  6


print(len(df[mask].index))
# 2

print(mask.all())
# False

Дополнительное внимание на этой строке:

mask = (df.D < df.E) & (df.A < df.B) & (df.B > df.C) 

, где (df.D < df.E) - это соотношение между D и E и (df.A < df.B) & (df.B > df.C) это отношение между A, B и C.Если оба значения оцениваются как True, отношения "совпадают" и конечный результат будет True.

0 голосов
/ 25 сентября 2019

Я нашел подход, который работал с использованием пакета operator для перебора всех комбинаций отношений неравенства.Это основной подход, который я использовал:

import itertools
from operator import *

for ineq1, ineq2, ineq3 in itertools.product([lt, le, ge, gt,
                                              lambda a, b: True],
                                              repeat=3):
    mask = ineq1(data.A, data.B) & ineq2(data.B, data.C) & ineq3(data.C, data.A)

    if data[mask].equals(taget_data):
      print([ineq.__name__ for ineq in [ineq1, ineq2, ineq3])
      break
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...