Сортировка по 3 столбцам и присвоение атрибута столбца по совпадению в pandas - PullRequest
1 голос
/ 31 марта 2020

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

В основном я пытаюсь пометить:

  • 1) Если три столбца совпадают по всем трем столбцам, пометьте как "Полное соответствие"
  • 2) Если они совпадают по двум столбцам, но последний имеет другую метку значения как «Конфликтующее значение» или «Частичное совпадение», если значение равно NA
  • 3) Если есть только одно значение, а остальные являются знаком NA как «Уникальный»
  • 4) Если все три столбца имеют NA, пометьте как «Пустой»

Первоначально, до того как я столкнулся с этой проблемой, я использовал df = df.sort_values(by = ['Cage_name_match_eid', 'Facility_match_eid', 'Clean_name_match_eid'], ascending = False)

Тем не менее, это не обеспечило никакой корреляции, по которой они совпадают в другом столбце. Моя следующая попытка использовала df[df.duplicated(['Cage_name_match_eid', 'Facility_match_eid', 'Clean_name_match_eid'], keep=False)], это удалило все уникальные значения, в которых я все еще нуждаюсь.

Наконец, я написал самую неопытную c, не элегантную функцию для сортировки на основе значений истинности. Он работает в некоторой степени, однако он помечает уникальные значения как конфликтующие, я решил спросить здесь, прежде чем писать алгоритм сортировки, который учителя CS будут использовать в качестве примера того, что NOT делать при сортировке ,

Вот функция:

def dupe_finder(row):
    if ((row['Cage_name_match_eid']) and (row['Facility_match_eid']) and (row['Clean_name_match_eid'])) is not None:

        if (row['Cage_name_match_eid'] == row['Facility_match_eid']) and \
                (row['Facility_match_eid'] == row['Clean_name_match_eid']) and \
                (row['Cage_name_match_eid'] == row['Clean_name_match_eid']):
            val = 'Full Match'
            return val
        elif (row['Cage_name_match_eid'] == row['Facility_match_eid']) or \
                (row['Facility_match_eid'] == row['Clean_name_match_eid']) or \
                (row['Cage_name_match_eid'] == row['Clean_name_match_eid']):
            val = 'Partial Match'
            return val
        elif (row['Cage_name_match_eid'] != row['Facility_match_eid']) or \
                (row['Facility_match_eid'] != row['Clean_name_match_eid']) or \
                (row['Cage_name_match_eid'] != row['Clean_name_match_eid']):
            val = 'Conflicting Values'
            return val
        elif (row['Cage_name_match_eid'] != row['Facility_match_eid']) and \
                (row['Facility_match_eid'] != row['Clean_name_match_eid']) and \
                (row['Cage_name_match_eid'] != row['Clean_name_match_eid']):
            val = 'Unique'
            return val
    else:
        val = 'Empty'
        return val


df['Dupes'] = left_over.apply(dupe_finder, axis = 1)

А вот некоторые примеры данных:

    Cage_name_match_eid Facility_match_eid Clean_name_match_eid          Dupes
122                 RrDyv0            RrDyv0              RrDyv0    Full Match
529                 JKvKeF            JKvKeF              JKvKeF    Full Match
133                 NaN               JR_enw              JR_enw  Partial Match
297                 NaN               CfODTf              CfODTf  Partial Match
465                 NaN               KeJuQu              KeJuQu  Partial Match
20                  NaN               J8dWGK              J8dWGK  Partial Match
626                 NaN               Et8z8K              Et8z8K  Partial Match
448                 NaN               Q2mmII              Q2mmII  Partial Match
226                 NaN               Fi1goI              Fi1goI  Partial Match
93                  GqSMp             qGMsp               qGMsp   Conflicting Match
60                  Jua2hK            Jb7fQF              Jb7fQF  Conflicting Match
558                 NaN               KE_nxZ              KE_nxZ  Partial Match
300                 NaN               Ohqbid              Ohqbid  Partial Match
84                  NaN               KfcqtH              KfcqtH  Partial Match
461                 NaN               NaN                 NaN      Empty

1 Ответ

1 голос
/ 31 марта 2020

Мой образец:

df = pd.DataFrame([[1,1,1], [1,1, np.NaN], [1,1,99], [np.NaN, np.NaN, 1], [np.NaN, np.NaN, np.NaN]], columns=['name1', 'name2', 'name3'])

    name1   name2   name3
0   1.0     1.0     1.0
1   1.0     1.0     NaN
2   1.0     1.0     99.0
3   NaN     NaN     1.0
4   NaN     NaN     NaN

Функция с логикой c

def foo(x):
    uq = len(set(x.dropna()))
    not_nul = len(x.dropna())
    if uq > 1:
        return "Conflicting Value"
    elif uq == 0:
        return "Empty"
    elif not_nul == 3:
        return "Full Match"
    elif not_nul == 2:
        return "Partial Match"
    elif not_nul == 1:
        return "Unique"
    else:
        return "???"

Применение функции:

df['new_col'] = df[['name1', 'name2', 'name3']].apply(foo, axis=1)

Результат:

    name1   name2   name3   new_col
0   1.0     1.0     1.0     Full Match
1   1.0     1.0     NaN     Partial Match
2   1.0     1.0     99.0    Conflicting Value
3   NaN     NaN     1.0     Unique
4   NaN     NaN     NaN     Empty
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...