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

#python #pandas #dataframe #duplicates

#python #pandas #фрейм данных #дубликаты

Вопрос:

У меня есть df такой:

     col1    col2    col3    col4
0   a       1       jake    
1   b       1       li
2   c       2       bob     corn
3   d       2       pat     
4   e       2       angie
5   f       1       jose    pepper
6   g       3       juan    
  

Что я должен сделать, так это обновить отсутствующее значение col4 для строк, где дублируется col2, и в любом из этих дубликатов существует значение col4.

Таким образом, результат будет выглядеть следующим образом:

     col1    col2    col3    col4
0   a       1       jake    pepper 
1   b       1       li      pepper
2   c       2       bob     corn
3   d       2       pat     corn
4   e       2       angie   corn
5   f       1       jose    pepper
6   g       3       juan
  

Есть мысли?

Ответ №1:

Я бы сделал fillna с groupby().transform :

 df['col4'] = df['col4'].fillna(df.groupby('col2')['col4'].transform('first'))
  

Вывод:

   col1  col2   col3    col4
0    a     1   jake  pepper
1    b     1     li  pepper
2    c     2    bob    corn
3    d     2    pat    corn
4    e     2  angie    corn
5    f     1   jose  pepper
6    g     3   juan     NaN
  

Ответ №2:

попробуйте это,

 dic = df[df["col4"].notnull()].set_index("col2")["col4"].to_dict()
df.loc[df["col4"].isnull(), "col4"]=df["col2"]
df["col4"] = df["col4"].replace(dic)
  

O/P:

   col1  col2      col3    col4
0    a     1      jake  pepper
1    b     1        li  pepper
2    c     2       bob    corn
3    d     2       pat    corn
4    e     2     angie    corn
5    f     1      jose  pepper
6    g     3      juan       3
  

вы могли бы удалить 3 , найдя str.isdigit()

Ответ №3:

Это может быть достигнуто следующим образом :

 dictionary = df[~(df.col4=='')].set_index("col2")["col4"].to_dict()
df.col4 = df.col2.apply(lambda x : dictionary[x] if x in dictionary.keys() else '')
  

Вывод:

 | col1   |   col2 | col3   | col4   |
|:-------|-------:|:-------|:-------|
| a      |      1 | jake   | pepper |
| b      |      1 | li     | pepper |
| c      |      2 | bob    | corn   |
| d      |      2 | pat    | corn   |
| e      |      2 | angie  | corn   |
| f      |      1 | jose   | pepper |
| g      |      3 | juan   |        |