#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 обновил ответ… Пожалуйста, взгляните 🙂