Замените неизвестные значения (другими медианными значениями)

#python #pandas

#питон #панды

Вопрос:

У меня есть особая проблема, я хотел бы очистить и подготовить свои данные, и у меня много неизвестных значений для столбца «highpoint_metres» моего фрейма данных (участников). Поскольку для «peak_id» отсутствует информация, я рассчитал среднее значение высоты в соответствии с peak_id, чтобы быть более точным. Я хотел бы выполнить два шага: 1) добавить новый столбец в мой фрейм данных «участники», где будет значение медианы, но различное в зависимости от «peak_id» (значение, рассчитанное благодаря коду в вопросе). 2) Что код проверяет, что значение в highpoint_metres равно нулю, если это так, то вместо него ставится значение нового столбца. Я не знаю, яснее ли это

код :

 import pandas as pd members = pd.read_csv("https://raw.githubusercontent.com/rfordatascience/tidytuesday/master/data/2020/2020-09-22/members.csv") print(members) mediane_peak_id = members[["peak_id","highpoint_metres"]].groupby("peak_id",as_index=False).median()  

И я не знаю, как продолжить оттуда (мой уровень python очень плох ;-))

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

1. Людям легче отвечать на вопросы, когда вы приводите пример того, как выглядит ваша база данных, и желаемый результат.

Ответ №1:

Я верю, что это то, что вы ищете:

 import numpy as np import pandas as pd  members = pd.read_csv("https://raw.githubusercontent.com/rfordatascience/tidytuesday/master/data/2020/2020-09-22/members.csv")  median_highpoint_by_peak = members.groupby("peak_id")["highpoint_metres"].transform("median") is_highpoint_missing = np.isnan(members.highpoint_metres) members["highpoint_meters_imputed"] = np.where(is_highpoint_missing, median_highpoint_by_peak, members.highpoint_metres)  

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

1. Большое вам спасибо, это именно то, что я хотел сделать, я искал это несколько часов, так что спасибо вам !!

Ответ №2:

таким образом, одним из способов замены 0 на медиану может быть:

 import numpy as np df[col_name] = df[col_name].replace({0: np.median(df[col_name])})  

Вы также можете использовать функцию применить:

 df[col_name] = df[col_name].apply(lambda x: np.median(df[col_name]) if x==0 else x)  

Дайте мне знать, если это поможет.

Поэтому добавим немного больше информации, основанной на вопросе Мари. Один из способов получить медиану-это через groupby, а затем слева соединить ее с исходным фреймом данных.

 df_gp = df.groupby(['peak_id']).agg(Median = (highpoint_metres, 'median')).reset_index() df = pd.merge(df, df_gp, on='peak_id') df = df.apply(lambda x['highpoint_metres']: x['Median'] if x['highpoint_metres']==np.nan else x['highpoint_metres'])  

Дайте мне знать, если это решит вашу проблему

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

1. ДЖИ, возможно, неправильно выразился. Я хотел бы выполнить два шага: 1) добавить новый столбец в мой фрейм данных «участники», где будет значение медианы, но различное в зависимости от «peak_id» (значение, рассчитанное благодаря коду в вопросе). 2) Что код проверяет, что значение в highpoint_metres равно нулю, если это так, то вместо него ставится значение нового столбца. Я не знаю, яснее ли это

2. Хорошо, тогда не могли бы вы задать свой вопрос немного яснее?