Как заполнить только отсутствующие значения в одном столбце фрейма данных значениями из другого фрейма данных в python?

#python #pandas #dataframe

Вопрос:

У меня есть 2 кадра данных, в каждом из которых несколько столбцов. Оба кадра данных содержат столбцы «SendID» и «SendDateTime» в качестве единственных одинаковых столбцов. Оба кадра данных имеют полностью заполненный «SendID». В Df1 отсутствует 30 000 «SendDateTime». В Df2 заполнены все «SendID» и «SendDateTime». Я хочу получить отсутствующее «SendDateTime» в df1 из df2 с помощью «SendID». Оба кадра данных имеют несколько столбцов, которые не совпадают.

df1 (7 столбцов)

 SendID   SendDateTime             Link
12345    10/12/2019  8:00:00 AM   Text Box
12345    10/12/2019  8:00:00 AM   View Browser
98765                             News
98765                             Social
45678    12/24/2019  11:00:00 AM  Shop
45678    12/24/2019  11:00:00 AM  Button
 

df2 (8 столбцов)

 SendID   SendDateTime             Subject
12345    10/12/2019  8:00:00 AM   Hello
98765    11/19/2019  9:30:00 AM   Welcome
45678    12/24/2019  11:00:00 AM  Please Read
 

Желаемый вывод в df1 (те же 7 столбцов), поэтому все отсутствующие «SendDateTime» заполняются с помощью «SendID» в df2:

 SendID   SendDateTime             Link
12345    10/12/2019  8:00:00 AM   Text Box
12345    10/12/2019  8:00:00 AM   View Browser
98765    11/19/2019  9:30:00 AM   News
98765    11/19/2019  9:30:00 AM   Social
45678    12/24/2019  11:00:00 AM  Shop
45678    12/24/2019  11:00:00 AM  Button
 

Я пытался:

 miss = df1[df1['SendDateTime'].isnull()]
nonmiss = df1[df1['SendDateTime'].notnull()]
miss = miss.merge(df2, how='left', on='SendID')
df1 = nonmiss.append(miss)
 

Я также пытался:

 df1.update(df2)
print(df1)
 

Как я могу сделать это правильно?

Ответ №1:

Вы можете получить отдельный идентификатор/время из df2, а затем объединить их в df1 после удаления столбца времени.

 df2_t = df2[['SendID','SendDateTime']].drop_duplicates()
df1.drop(columns='SendDateTime').merge(df2_t, on='SendID')
 

Выход

    SendID          Link             SendDateTime
0   12345      Text Box   10/12/2019  8:00:00 AM
1   12345  View Browser   10/12/2019  8:00:00 AM
2   98765          News   11/19/2019  9:30:00 AM
3   98765        Social   11/19/2019  9:30:00 AM
4   45678          Shop  12/24/2019  11:00:00 AM
5   45678        Button  12/24/2019  11:00:00 AM