Pandas - FillNa с другим столбцом

27

Я хотел бы заполнить пропущенное значение в одном столбце значением другого столбца.

Я читал, что цикл по каждой строке будет очень плохой практикой и что было бы лучше сделать все за один раз, но я не мог узнать, как это сделать с помощью метода fillna .

Данные перед

Day  Cat1  Cat2
1    cat   mouse
2    dog   elephant
3    cat   giraf
4    NaN   ant

Данные после

Day  Cat1  Cat2
1    cat   mouse
2    dog   elephant
3    cat   giraf
4    ant   ant
    
задан xav 20.05.2015 в 20:08
источник

3 ответа

54

Этот столбец можно указать в fillna (см. docs ), он будет использовать эти значения для соответствия индексов для заполнения:

In [17]: df['Cat1'].fillna(df['Cat2'])
Out[17]:
0    cat
1    dog
2    cat
3    ant
Name: Cat1, dtype: object
    
ответ дан joris 20.05.2015 в 20:14
источник
  • Приятно! Я не знал, что филна принимает серию. –  Ami Tavory 20.05.2015 в 20:15
  • Спасибо! Я думал, что серия должна быть точного размера числа значений NA. –  xav 20.05.2015 в 23:04
6

Вы могли бы сделать

df.Cat1 = np.where(df.Cat1.isnull(), df.Cat2, df.Cat1)

Общая конструкция в RHS использует тройственный шаблон из pandas cookbook (которую он платит, чтобы читать в любом случае). Это векторная версия a? b: c .     

ответ дан Ami Tavory 20.05.2015 в 20:12
источник
  • Не решение, которое я использовал для этой проблемы, но очень интересный образец! Благодаря! –  xav 20.05.2015 в 23:04
  • Тебе очень рады. –  Ami Tavory 13.05.2018 в 21:15
4

Просто используйте параметр value вместо method :

In [20]: df
Out[20]:
  Cat1      Cat2  Day
0  cat     mouse    1
1  dog  elephant    2
2  cat     giraf    3
3  NaN       ant    4

In [21]: df.Cat1 = df.Cat1.fillna(value=df.Cat2)

In [22]: df
Out[22]:
  Cat1      Cat2  Day
0  cat     mouse    1
1  dog  elephant    2
2  cat     giraf    3
3  ant       ant    4
    
ответ дан chrisaycock 20.05.2015 в 20:14
источник
  • Спасибо за ответ! Что он изменил, чтобы использовать значение, а не метод, описанный joris? –  xav 20.05.2015 в 23:06
  • Значение @xav является первым параметром, поэтому joris фактически выполняет то же самое. По его словам, см. Документы. –  chrisaycock 21.05.2015 в 00:02
  • Да, docstring немного вводит в заблуждение, поскольку метод указан там первым. –  joris 21.05.2015 в 08:27