Pandas fillna только в строках с хотя бы 1 значением, отличным от NaN

Предположим, у меня есть DataFrame, построенный следующим образом:

import pandas as pd
import numpy as np

df = pd.DataFrame(data = {"col1":[3, np.nan, np.nan, 21],
                          "col2":[4, np.nan, 12, np.nan],
                          "col3":[33, np.nan, 55, np.nan]})

Что выглядит так:

    col1     col2     col3
0   3.0      4.0      33.0
1   NaN      NaN      NaN
2   NaN      12.0     55.0
3   21.0     NaN      NaN

Я хочу отфильтровать столбцы, которые имеют хотя бы одно значение, отличное от NaN, а затем заполнить их на месте.

Если я сделаю следующее:

df.loc[df.dropna(thresh=1).index, :].fillna("fill value")

Это создает новый DataFrame, в котором правильно заполнены значения, и удалена строка, состоящая из NaN.

Но я хочу сохранить всю строку NaN, поэтому я пытаюсь применить это на месте:

df.loc[df.dropna(thresh=1).index, :].fillna("fill value", inplace=True)

но в исходный DataFrame не вносятся изменения - что я делаю не так?


person Toby Petty    schedule 24.05.2018    source источник
comment
df.loc[df.dropna(thresh=1).index, :] возвращает копию. Таким образом, параметр inplace относится не к фактическому df, а к этой копии. Он изменяет эту копию, но вы ее никогда не видите.   -  person ayhan    schedule 24.05.2018


Ответы (1)


Чтобы уточнить, вы хотите, чтобы все строки NaN оставались nans, но заполняли другие NaN значением? А на месте?

Что-то вроде этого должно работать:

df.where(df.isnull().all(axis=1), df.fillna(100), inplace=True)

Где хранятся значения, где вся строка равна нулю, в противном случае заменяется значением df.fillna().

person Lzkatz    schedule 24.05.2018
comment
Отличное спасибо - раньше не использовал df.where - выглядит действительно полезно. - person Toby Petty; 24.05.2018