Предыдущий и следующий массив должны иметь два очень общих значения панд - PullRequest
0 голосов
/ 07 ноября 2019

У меня есть такой фрейм данных,

Test              Test1
[1,1,1]          [1,2,2]
[1,2,2]          [1,0,1]
[1,0,1]          [1,1,0]
[2,2,0]          [0,2,2]
[1,2,0]          [1,0,2]

Я пытаюсь сравнить два массива, где должны совпадать 2 числа, а третье должно быть o.Так как [1,0,1] [1,1,0] должно совпадать и вернуть true какдва числа совпадают, а третье - 0. то же самое для [2,2,0] [0,2,2], но [1,2,0] [1,0,2] это не должно совпадать, так как оно не имеет одинаковых чисел. Вернет false. Итак, есть ли способ сделать это?

Ответы [ 3 ]

0 голосов
/ 07 ноября 2019

Это функция тестирования, которая вам нужна (я думаю, если предположить, что все значения положительные)

def test_func(x):
    A = x[0]
    B = x[1]
    f = lambda X: np.unique(X, return_counts = True)
    Au, Ac = f(A)
    Bu, Bc = f(B)
    return np.all(Au == Bu) and \ 
           Au.size == 2 and  \     
           Ac[0] == 1 and \        
           Bc[0] == 1              

И применить в pandas (не эксперт по пандам, но я думаю, что это должно работать):

df['new_col'] = df[['Test', 'Test1']].apply(test_func, axis = 1)

в любом случае этот вопрос должен помочь вам применить вашу функцию к двум столбцам.

0 голосов
/ 07 ноября 2019

Вы имеете в виду, как это?

>>> def compare_tuples(x, y):
...     return (
...         # there is any series of size two which is common in both tuples
...         any(x[i:i+2] == y[j:j+2] for i in range(2) for j in range(2))
...         # there is at least one zero at third position
...         and 0 in (x[2], y[2])
...     )

>>> df = pd.DataFrame.from_records([
...     [(1, 1, 1), (1, 2, 2)],  # False
...     [(1, 2, 2), (1, 0, 1)],  # False
...     [(1, 0, 1), (1, 1, 0)],  # True - (1, 0) matches and 0 in third position
...     [(2, 2, 0), (0, 2, 2)],  # True - (2, 2) matches and 0 in third position
...     [(1, 2, 0), (1, 0, 2)],  # False
... ], columns=["Test1", "Test2"])

>>> df.apply(lambda x: compare_tuples(*x), axis=1)
0    False
1    False
2     True
3     True
4    False
dtype: bool
0 голосов
/ 07 ноября 2019

Используя эту функцию, вы можете сравнить два кортежа и проверить, соответствуют ли они вашим требованиям:

def eval_tuples(tup1, tup2):
    # Check if zeros occures once in each tuple
    if tup1.count(0) != 1 or tup2.count(0) != 1:
        return False

    # Get non-zero values
    rem1 = [x for x in tup1 if x != 0]
    rem2 = [x for x in tup2 if x != 0]

    # Check if they are equal in both tuples
    if rem1[0] != rem1[1] or rem2[0] != rem2[1]:
        return False
    return True

Вот несколько примеров выполнения функции:

print(eval_tuples([1,1,0], [1,0,1]))
# True
print(eval_tuples([1,1,0], [2,0,1]))
# False
print(eval_tuples([2,2,0], [0,2,2]))
# True
print(eval_tuples([1,2,0], [1,0,2]))
# False
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...