#python #pandas #dataframe
#python #pandas #фрейм данных
Вопрос:
новичок в python и, похоже, не могу найти точный ответ, который ищу, хотя я считаю, что есть более простой способ заполнить эту информацию
У меня есть df1 и df2
df1: FirstName LastName PhNo uniqueid
df2: uniqueid PhNo
Я хочу заполнить значения, отсутствующие в df1 [‘PhNo’], соответствующими значениями в df2 на основе соответствия uniqueid == uniqueid
Коды, которые я использовал, следующие
dff = pd.merge(df1,df2,on = 'uniqueid', how = 'Left')
dff['PhNo'] = 0
dff['PhNo'][df1['PhNo_x'] >= 1] = df1['PhNo_x']
df1['PhNo'][df2['PhNo_y'] >= 1] = df1['PhNo_y']
кажется, что это выполняет работу, но не кажется эффективным способом сделать это. Я ищу меньшее количество строк и лучшую технику, чем merge
df1
FirstName LastName PhNo uniqueid
Sam R 123x 1
John S 345x 2
Paul K np.Nan 3
Laney P no.NaN 4
df2
uniqueid PhNo
1 213x
3 675x
4 987x
желаемый результат: df1
FirstName LastName PhNo uniqueid
Sam R 123x 1
John S 345x 2
Paul K **675x** 3
Laney P **987x** 4
Комментарии:
1. Можете ли вы добавить некоторый образец данных, 4-5 строк с ожидаемым результатом?
2. я добавил образец данных в соответствии с запросом…
3. Спасибо, значит, решение работает нормально?
Ответ №1:
Я считаю, что вам нужно Series.map
с Series.fillna
:
df1 = pd.DataFrame({
'FirstName':list('abcdef'),
'LastName':list('aaabbb'),
'PhNo':[7,np.nan,9,4,np.nan,np.nan],
'uniqueid':[5,3,6,9,2,4],
})
print (df1)
FirstName LastName PhNo uniqueid
0 a a 7.0 5
1 b a NaN 3
2 c a 9.0 6
3 d b 4.0 9
4 e b NaN 2
5 f b NaN 4
df2 = pd.DataFrame({
'PhNo':[10,90,30,20],
'uniqueid':[3,6,9,4],
})
print (df2)
PhNo uniqueid
0 10 3
1 90 6
2 30 9
3 20 4
s = df2.set_index('uniqueid')['PhNo']
df1['PhNo'] = df1['PhNo'].fillna(df1['uniqueid'].map(s))
print (df1)
FirstName LastName PhNo uniqueid
0 a a 7.0 5
1 b a 10.0 3
2 c a 9.0 6
3 d b 4.0 9
4 e b NaN 2
5 f b 20.0 4
Комментарии:
1. @anky_91 — Я запрашиваю данные для 100% проверки
![]()
2. @jezrael Я получаю 0, а не значение из df2
3. @jezrael обнаружил ошибку, в моей базе данных было «0», а не пустая строка, df1[‘PhNo’].replace(0,np.nan,inplace = True), однако, сделал свое дело. Будет ли аналогичное решение работать для значений «0» или я должен опубликовать его как отдельный вопрос?
4. @Shri — With
0
— это решениеdf1['PhNo'] = np.where(df1['PhNo'] == 0, df1['uniqueid'].map(s), df1['PhNo'])
Ответ №2:
DataFrame.fillna(значение= amp;n)