#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. Если это решение работает для вас, вы можете принять ответ, если нет, никаких проблем. Выполнение этого пометит вопрос как ответ.