Python Pandas: лучший способ получить уникальные строки из столбца - PullRequest
0 голосов
/ 30 марта 2020

У меня есть датафрейм с разными столбцами, такими как:
1) мобильный телефон cust no
2) домашний телефон cust
3) следующий телефон cust
4) факс cust
5) cust id

В моем выходном фрейме данных мне бы хотелось иметь такие столбцы, как:
1) cust id
2) cust phone 1
3) cust phone 2
4) cust phone 3
5) cust phone 4

Отображение между входными и выходными телефонными номерами выглядит следующим образом (но также имеется приоритетная логика c):

cust phone 1 = cust mobile phone no    
cust phone 2 = cust home phone    
cust phone 3 = cust nextkin phone    
cust phone 4 = cust fax 

Обратите внимание, что любой из них может быть пустым во входном фрейме данных. Приоритет логики c говорит о том, что если один из них пуст, то этому столбцу телефона должен быть присвоен следующий доступный номер телефона. Таким образом, если обычный телефон 2 пуст, но обычный телефон 3 доступен, то для мобильного телефона 2 должно быть назначено значение и так далее. Кроме того, все телефонные звонки от 1 до 4 должны быть уникальными (без дубликатов).

Поскольку кадр данных большой, перебор строк не возможен.

Вот пример фрейма данных :

df = pd.DataFrame({'cust mobile no': ['1', '2', '3'],
                  'cust home phone': [np.nan, '2', 'x'],
                  'cust nextkin phone': ['1', '2', 'g'],
                  'cust fax': [np.nan, '4', '5'],
                  'cust id': ['001', '002', '003']})

  cust mobile no cust home phone cust nextkin phone cust fax cust id
0              1             NaN                  1      NaN     001
1              2               2                  2        4     002
2              3               x                  g        5     003

Ожидаемый результат:

  cust id cust phone 1 cust phone 2 cust phone 3 cust phone 4
0     001            1          NaN          NaN          NaN
1     002            2            4          NaN          NaN
2     003            3            x            g            5

1 Ответ

0 голосов
/ 30 марта 2020

Сначала определите функцию, которая реализует необходимую вам логику c, используя все четыре столбца:

from itertools import zip_longest
input_keys = ["cust mobile no", "cust home phone", "cust nextkin phone", "cust fax"]
output_keys = [f"cust phone {n}" for n in range(1, 5)]

def assign_phone_nrs(row): 
    l = [row[k] for k in input_keys if row[k] != "nan"] # get columns != 'nan'
    l = list(dict.fromkeys(l).keys())  # remove duplicates, keep order 
    output_phone_nrs = dict(zip_longest(output_keys, l, fillvalue=np.nan))  # pad with nans & put into dict
    output_phone_nrs["cust id"] = row["cust id"]   # add original id
    return pd.Series(output_phone_nrs) 

Теперь примените это к вашему входному фрейму данных:

>>> df.apply(assign_phone_nrs, axis=1)                                                                                                                                              
  cust phone 1 cust phone 2 cust phone 3 cust phone 4 cust id
0            1          NaN          NaN          NaN     001
1            2            4          NaN          NaN     002
2            3            x            g            5     003
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...