Вменение пропущенных значений и их разделение

#python #missing-data #imputation

#python #отсутствует-данные #вменение

Вопрос:

представьте себе набор данных, подобный следующему:

df = pd.DataFrame({‘Контакты 6M’:[4,7,20,5,6,0,1,19], ‘Контакты 3M’: [2,3,9, np.nan,np.nan,0,np.nan,9]})

введите описание изображения здесь

Как вы можете себе представить: столбец «Контакты 6M» — это подсчитанное количество контактов за последние 6 месяцев, где в другом столбце содержится информация о количестве контактов за последние 3 месяца. Таким образом, «Контакты 3M» включают в себя части информации другого столбца.

Я вменяю пропущенные значения с помощью метода forward fill:

df.ffill(axis = 1, inplace=True)

Мой вопрос: как мне разделить вмененное значение на 2 и округлить вмененные значения (пожалуйста, без плавающих значений) при итерации по набору данных?

Ответ №1:

Это можно легко сделать таким образом:

 df.iloc[df[df['Contacts 3M'].isna()].index,1]=df[df['Contacts 3M'].isna()]['Contacts 6M']/2

df['Contacts 3M']=df['Contacts 3M'].astype('int')

  

Ответ №2:

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

 import pandas as pd
import numpy as np

df = pd.DataFrame({'Contacts 6M': [4, 7, 20, 5, 6, 0, 1, 19], 'Contacts 3M': [2, 3, 9, np.nan, np.nan, 0, np.nan, 9]}, dtype=np.int)
mask = df['Contacts 3M'].isna()

df = df.ffill(axis=1)  # for some weird reason, inplace=True was throwing 'NotImplementedError'
df['Contacts 3M'][mask] //= 2

print(df)
  

Вывод

    Contacts 6M  Contacts 3M
0            4            2
1            7            3
2           20            9
3            5            2
4            6            3
5            0            0
6            1            0
7           19            9
  

Комментарии:

1. Приветствую быстрый ответ. Я забыл упомянуть, что вмененное значение должно быть округлено. Значение с плавающей точкой не имело бы смысла. Не могли бы вы добавить это?

2. Изменен на целочисленное деление и добавлен тип данных при создании фрейма данных

3. Если это решение работает для вас, вы можете принять ответ, если нет, никаких проблем. Выполнение этого пометит вопрос как ответ.