сравнить два фрейма данных и добавить новый столбец в фрейм данных на основе значений маски - PullRequest
0 голосов
/ 21 февраля 2019

Я сравниваю два фрейма данных на основе их идентификаторов, а затем объединяю их, используя следующий код:

        df = df1.merge(df2, on=id, suffixes=('_x','_y'))    

df1

        name  age  id  salary  
    0   Smith   30   2    2000  
    1     Ron   24   3   30000  
    2    Mike   35   4   40000  
    3    Jack   21   5    5000  
    4  Roshan   20   6   60000  
    5   Steve   45   8    8000  
    6   Peter   28   1    1000  

df2

       name  age  salary  id  
    0  Peter   32   10000   1  
    1  Smith   30    1500   2  
    2    Ron   24    7000   3  
    3   Mike   35   20000   4  
    4   Jack   21    5000   5  
    5  Cathy   20    9000   6  
    6  Steve   45   56000   8  

o / p

            name_x  age_x  id  salary_x name_y  age_y  salary_y  
        0   Smith     30   2      2000  Smith     30      1500  
        1     Ron     24   3     30000    Ron     24      7000  
        2    Mike     35   4     40000   Mike     35     20000  
        3    Jack     21   5      5000   Jack     21      5000  
        4  Roshan     20   6     60000  Cathy     20      9000  
        5   Steve     45   8      8000  Steve     45     56000  
        6   Peter     28   1      1000  Peter     32     10000  

Теперь, основываясь на выводе, я сравниваю значения столбцов _x и _y и помещаю их в маску:

        mask = df[cols + '_x'].values == df[cols + '_y'].values    
        print(mask)    

mask o / p

    [[ True  True False]  
    [ True  True False]  
    [ True  True False]  
    [ True  True  True]  
    [ True False False]  
    [ True  True False]  
    [False  True False]]  

Основываясь на этом значении маски, я хочу поставить условие, что если false присутствует в маске, скажем, [1], то это должно дать мне совокупный результат 'No MAtch', который я могу добавить к своим результатам вывода, например:

        name_x  age_x  id  salary_x name_y  age_y  salary_y  new_column  
    0   Smith     30   2      2000  Smith     30      1500  No Match  
    1     Ron     24   3     30000    Ron     24      7000  No Match  
    2    Mike     35   4     40000   Mike     35     20000  No Match  
    3    Jack     21   5      5000   Jack     21      5000  MAtch  
    4  Roshan     20   6     60000  Cathy     20      9000  No Match  
    5   Steve     45   8      8000  Steve     45     56000  No Match  
    6   Peter     28   1      1000  Peter     32     10000  No Match

Ответы [ 3 ]

0 голосов
/ 21 февраля 2019
matches = ['Match' if x else 'No Match' for x in np.all(mask, axis = -1)]

даст вам массив значений 'Match' и 'No Match', которые вы можете добавить к кадру данных с помощью:

df['newColumnName'] = matches 
0 голосов
/ 21 февраля 2019

Используйте numpy.where с numpy.all для быстрого векторизованного решения:

mask = df[cols + '_x'].values == df[cols + '_y'].values  

df['new_column'] = np.where(np.all(mask, axis=1) , 'Match','No Match')
print (df)
   name_x  age_x  id  salary_x name_y  age_y  salary_y new_column
0   Smith     30   2      2000  Smith     30      1500   No Match
1     Ron     24   3     30000    Ron     24      7000   No Match
2    Mike     35   4     40000   Mike     35     20000   No Match
3    Jack     21   5      5000   Jack     21      5000      Match
4  Roshan     20   6     60000  Cathy     20      9000   No Match
5   Steve     45   8      8000  Steve     45     56000   No Match
6   Peter     28   1      1000  Peter     32     10000   No Match

Спасибо за комментарий @markuscosinus, если нужно сравнить по секундам 'column' маски выбираются путем индексации - здесь mask[:, 1]:

df['new_column'] = np.where(mask[:, 1] , 'Match','No Match')
0 голосов
/ 21 февраля 2019

Преобразуйте маску в пустой массив или фрейм данных, или он должен быть уже в следующем формате:

mask = pd.DataFrame([[ True, True, False],
                     [ True, True, False],
                     [ True, True, False],
                     [ True, True, True],
                     [ True, False, False],  
                     [ True, True, False],  
                     [False, True, False]])

А затем следующий код даст вам нужный столбец:

mask.apply(sum, axis=1).apply(lambda x: 'Match' if x==3 else 'No Match')

Вы можете добавить этот столбец к df.

Надеюсь, это поможет ...:)

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