заполните NaN из других записей в фрейме данных и отфильтруйте уникальные записи

#python #pandas #dataframe #lambda

Вопрос:

У меня есть следующий df:

 df4 = pd.DataFrame(np.array([['cus1234', 'Sara@example.com','Mexico', np.NaN],['cus1234', np.NaN ,'Mexico','348384'],['cus1234', 'Sara@example.com',np.NaN ,'348384'],['cus1234', 'Sara@example.com','Mexico', np.NaN], ['cus930', 'fernandino@example.com','US', np.NaN ], ['cus930', 'fernandino@example.com',np.NaN,'38483483'],['cus930', 'fernandino@example.com',np.NaN ,'38483483'],['cus800033132', 'dumm@example.com','US',np.NaN ],['cus800033132', 'dumm@example.com','US','300309494994']]),

                   columns=['CustomerID', 'email','Country','phone'])
 

df4:

      CustomerID     email               Country          phone
0   cus1234        Sara@example.com      Mexico           nan
1   cus1234           nan                Mexico         348384
2   cus1234        Sara@example.com         nan         348384
3   cus1234        Sara@example.com      Mexico          nan
4   cus930         fernandino@example.com   US           nan
5   cus930         fernandino@example.com   nan     38483483
6   cus930         fernandino@example.com   nan     38483483
7   cus800033132   dumm@example.com          US         nan
8   cus800033132   dumm@example.com          US     300309494994
 

Идентификатор клиента повторяется, но информация о клиентах не является полной. Я хочу заполнить NaN, если он найден для каждого идентификатора пользователя, а затем удалить дублированный с drop_duplicates()

Что я делал до сих пор:

 df4.groupby(['CustomerID']).fillna(method='ffill')

df4.groupby(['CustomerID'], sort=False).apply(lambda x: x.ffill().bfill())
 

Но не повезло, ожидаемый результат:

 CustomerID        email                 Country     phone
cus1234        Sara@example.com         Mexico     348384   
cus930         fernandino@example.com   US         38483483
cus800033132    dumm@example.com        US         300309494994
 

Ответ №1:

пробовать:

замените строку nan на фактические NaN:

 df4=df4.replace('nan',float('NaN'))
 

Окончательно:

 out=df4.groupby(['CustomerID']).ffill().bfill().drop_duplicates().join(df4['CustomerID'])
 

выход из out :

     email                  Country      phone           CustomerID
0   Sara@example.com        Mexico      348384          cus1234
4   fernandino@example.com  US          38483483        cus930
7   dumm@example.com        US          300309494994    cus800033132
 

Комментарии:

1. Спасибо, Анураг, вывод не точен, у cust930 должно быть другое электронное письмо, отличное от входного

2. @Mtaly обновил ответ… Пожалуйста, взгляните 🙂