Лучший способ заполнить nans, получив среднее значение из нескольких столбцов ⇐ Python

Программы на Python
Anonymous
Лучший способ заполнить nans, получив среднее значение из нескольких столбцов

Сообщение Anonymous »

У меня есть фрейм данных с отзывами о ресторанах. столбцу «Настроение описания» присвоена оценка в диапазоне от -1,00 до +1,00. Некоторые строки имеют значение 0 (из-за некоторых других факторов в кадре данных), поэтому я хотел бы интерполировать некоторые строки на основе другой информации, например оценки награды.

Код: Выделить всё

interpolate_cols = ["description_sentiment", "Award_ordinal"]
Насколько я понимаю, лучшая практика интерполяции — установить маску и использовать ее для каждого возможного значения, как, например, в последнем блоке ниже.

Код: Выделить всё

nan_mask = (michelin["description_sentiment"]==np.nan)

award1_mask = (michelin["Award_ordinal"]==1)
award2_mask = (michelin["Award_ordinal"]==2)
award3_mask = (michelin["Award_ordinal"]==3)
award4_mask = (michelin["Award_ordinal"]==4)
award5_mask = (michelin["Award_ordinal"]==5)

michelin.loc[nan_mask & award1_mask, "description_sentiment"] = michelin.loc[award1_mask, "description_sentiment"].mean()
...
а затем перечислить все возможные значения.
Мой вопрос: что произойдет, когда сложность данных увеличится, т. е. появится больше функций. лучший способ действительно перечислить все по отдельности? или есть более простой программный способ, например:

Код: Выделить всё

interpolate() np.nan for col.unique(), col.unique(), col.unique()
большое спасибо.

Редактировать: MRE
первые три столбца следует считать порядковыми, следующие три номинальными, следующие несколько с горячим кодированием [логическое значение из категориального номинала] и последний непрерывный.

Код: Выделить всё

df = pd.DataFrame({

"A" : np.random.choice([1, 12], 1000),
"B" : np.random.choice([1, 20], 1000),
"C" : np.random.choice([1, 25], 1000),

"D" : np.random.choice(["Japan", "China", "Indonesia", "Thailand", "Laos", "Cambodia", "Philippines"], 1000),
"E" : np.random.choice(["Japan", "China", "Indonesia", "Thailand", "Laos", "Cambodia", "Philippines"], 1000),
"F" : np.random.choice(["Japan", "China", "Indonesia", "Thailand", "Laos", "Cambodia", "Philippines"], 1000),

"G" : np.random.choice([0, 1], 1000),
"H" : np.random.choice([0, 1], 1000),
"I" : np.random.choice([0, 1], 1000),
"J" : np.random.choice([0, 1], 1000),
"K" : np.random.choice([0, 1], 1000),
"L" : np.random.choice([0, 1], 1000),
"M" : np.random.choice([0, 1], 1000),

"missing_values" : np.random.choice(np.arange(0,1000), 1000) /100
})

df.loc[df["missing_values"].sample(frac=0.1).index, "missing_values"] = np.nan
насколько я понимаю, интерполяцию использовать нельзя, поскольку она подразумевает линейную связь между отсутствующими значениями и не является таймсерией. случайный лес или дерево решений могли бы работать, но я надеялся найти решение с помощью маски.
есть ли программный способ добиться этого?

Подробнее здесь: https://stackoverflow.com/questions/790 ... le-columns

Вернуться в «Python»