Как заменить значения NaN, если другие столбцы соответствуют определенным критериям? - PullRequest
0 голосов
/ 31 августа 2018

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

В моем конкретном примере я пытаюсь заменить неизвестный возраст пассажиров 1-го класса средним возрастом пассажиров 1-го класса.

Как мне это сделать?

Мне удалось сегментировать данные и заменить нулевые значения этого нового кадра данных, но он не переносится на исходный кадр данных, и мне немного неясно, как это сделать.

Вот мой код:

missingage_1stclass_male = pd.DataFrame(
    titanic[
        (titanic['Age'].isnull()) &
        (titanic['Pclass'] == 1) &
        (titanic['Sex'] == 'male')
    ]
)
missingage_1stclass_male.Age.fillna(40.5, inplace=True)

Мой исходный кадр данных со всеми значениями назван титаническим.

Ответы [ 4 ]

0 голосов
/ 01 сентября 2018

Я пытаюсь заменить неизвестного возраста пассажира 1-го класса. со средним возрастом мужчин, пассажиров 1-го класса.

Вы можете разбить проблему на 2 этапа. Сначала рассчитать средний возраст пассажиров мужского пола 1-го класса:

mask = (df['Pclass'] == 1) & (df['Sex'] == 'male')
avg_filler = df.loc[mask, 'Age'].mean()

Затем обновите значения, удовлетворяющие вашим критериям:

df.loc[df['Age'].isnull() & mask, 'Age'] = avg_filler
0 голосов
/ 31 августа 2018

Я думаю .fillna () поможет вам в этом

Вот пример использования:

>>> df = pd.DataFrame([[np.nan, 2, np.nan, 0],
...                    [3, 4, np.nan, 1],
...                    [np.nan, np.nan, np.nan, 5],
...                    [np.nan, 3, np.nan, 4]],
...                    columns=list('ABCD'))
>>> df
     A    B   C  D
0  NaN  2.0 NaN  0
1  3.0  4.0 NaN  1
2  NaN  NaN NaN  5
3  NaN  3.0 NaN  4

>>> df.fillna(0)
A   B   C   D
0   0.0 2.0 0.0 0
1   3.0 4.0 0.0 1
2   0.0 0.0 0.0 5
3   0.0 3.0 0.0 4
0 голосов
/ 31 августа 2018

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

df[df['Pclass'] == 1 & df['Sex'] == 'male'].fillna(df['age'].mean())
0 голосов
/ 31 августа 2018

Вы можете сгруппировать данные по необходимым столбцам и заполнить, что-то вроде

df['age'] = df.groupby(['pclass', 'sex']).age.apply(lambda x: x.fillna(x.mean()))

Редактировать: для заполнения нулевых значений только определенных строк

df.loc[((df.pclass == 1) & (df.sex == 'male') & (df.age.isnull())) , 'age'] = df.loc[((df.pclass == 1) & (df.sex == 'male') ) , 'age'].mean()
...