заполнение недостающих значений во фрейме данных pandas

#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)