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

У меня есть кадр данных, подобный приведенному ниже:

df = pd.DataFrame({'col_1': [1.01,-2.02,None], 'col_2': [1.01,-2.02,None]}, columns=['col_1', 'col_2'])

Вы можете думать о col_1 и col_2 как о x- и y-координатах соответственно.Мне нужно иметь возможность проверить каждую строку этого кадра данных по трем треугольникам на координатной плоскости и добавить столбец «col_3» к кадру данных, который сообщает мне, в каком из трех треугольников находится точка.

Например,, при индексе 0 мы видим точку (1.01, 1.01).Если у меня есть

«треугольник 1» с точками (0.0, 0.0), (0.0, 2.1), (3.2, 0.0),

«треугольник 2» с точками (0.0, 0.0), (0.0, -3.1), (-3.1, 0.0) и

«треугольник 3» сточки (3.5, 0.0), (3.5, 3.5), (4.5, 0.0),

, тогда точка с индексом 0 (1.01, 1.01) будет лежать в пределах «треугольника 1», а col_3 для индекса 0 будет иметь значение «треугольника 1».Строка для индекса 1 (-2.02, -2.02) попадет в «треугольник 2», а индекс 2 будет None или null, поскольку там нет точек.

Я нашел набор функций, которые хорошо работают, чтобы определить,точка лежит внутри треугольника, я просто не уверен, как все связать:

# A utility function to calculate area of triangle formed by (x1, y1), (x2, y2) and (x3, y3)
def area(x1, y1, x2, y2, x3, y3):
    return abs((x1 * (y2 - y3) + x2 * (y3 - y1) + x3 * (y1 - y2)) / 2.0)

# A function to check whether point P(x, y) lies inside the triangle formed by A(x1, y1), B(x2, y2) and C(x3, y3)
def isInside(x1, y1, x2, y2, x3, y3, x, y):
    # Calculate area of triangle ABC
    A = area (x1, y1, x2, y2, x3, y3)
    # Calculate area of triangle PBC
    A1 = area (x, y, x2, y2, x3, y3)
    # Calculate area of triangle PAC
    A2 = area (x1, y1, x, y, x3, y3)
    # Calculate area of triangle PAB
    A3 = area (x1, y1, x2, y2, x, y)

    # Check if sum of A1, A2 and A3 is same as A
    if(A == A1 + A2 + A3):
        return True
    else:
        return False
# Driver program to test above function
# Let us check whether the point P(10, 15) lies inside the triangle formed by A(0, 0), B(20, 0) and C(10, 30) 
if (isInside(0, 0, 20, 0, 10, 30, 10, 15)):
    print('Inside')
else:
    print('Not Inside')

В приведенной выше функции isInside первые 6 аргументов различны для каждого треугольника, а последние 2 аргументадолжны быть значения col_1 и col_2 для каждой строки.Я попытался создать условный беспорядок «если», но в итоге получил

ValueError: ('Значение истинности для серии неоднозначно. Используйте a.empty, a.bool (), a.item (), a.any () или a.all (). 'и ValueError («Значение истинности {0} неоднозначно.»).

Любая помощь будет принята с благодарностью!

1 Ответ

0 голосов
/ 01 января 2019

Вы можете попробовать это:

def whereIsIt(row):
    x = row['col_1']
    y = row['col_2']
    if x is None or y is None:
        return None
    #(0.0, 0.0), (0.0, 2.1), (3.2, 0.0)
    if isInside(0.0,0.0,0.0,2.1,3.2,0.0,x,y):
        return 1
    # (0.0, 0.0), (0.0, -3.1), (-3.1, 0.0)
    elif isInside(0.0,0.0,0.0,-3.1,-3.1,0.0,x,y):
        return 2
    #(3.5, 0.0), (3.5, 3.5), (4.5, 0.0)
    elif isInside(3.5,0.0,3.5,3.5,4.5,0.0,x,y):
        return 3
    else:
        return None

df['col_3']=df.apply(lambda row: whereIsIt(row),axis=1)
df.head()

Кстати, вывод:

    col_1   col_2   col_3
0   1.01    1.01    1.0
1   -2.02   -2.02   NaN
2   NaN NaN NaN

(- 2.02, -2.02) не находится внутри «треугольника 2» с точками (0,0, 0,0), (0,0, -3,1), (-3,1, 0,0) или указанная вами функция неверна.:)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...