#python #pandas
#python #pandas
Вопрос:
У меня есть фрейм данных с несколькими значениями, равными нулю. Я хочу заменить нулевые значения на средние значения этого столбца без повторения кода. У меня есть столбцы, называемые runtime, budget и revenue, которые все имеют нуль, и я хочу заменить эти нулевые значения средним значением этого столбца.
Я пытался делать это по одному столбцу за раз, вот так:
print(df['budget'].mean())
-> 14624286.0643
df['budget'] = df['budget'].replace(0, 14624286.0643)
Является ли это способом написания функции, чтобы не приходилось писать код несколько раз для каждого нулевого значения для всех столбцов?
Ответ №1:
Итак, это pandas
фрейм данных, который я буду использовать, чтобы mask
преобразовать все 0 в np.nan
, затем fillna
df=df.mask(df==0).fillna(df.mean())
Комментарии:
1. поскольку у меня несколько столбцов, заменит ли это нулевое значение на среднее значение соответствующего столбца, например, 0 в столбце бюджет будет заменен на среднее значение бюджета только столбца, а другие столбцы, имеющие значения 0, будут заменены на среднее значение этих столбцов?
2. Извините, я впервые сталкиваюсь с stack overflow.
3. @BobbyGee да, это будет 🙂 замените 0 на их среднее значение
4. Спасибо за помощь. Есть ли хороший ресурс, который вы порекомендуете мне для более глубокого изучения pandas и python для анализа данных.
5. @BobbyGee вы можете поискать pandas cookbook, я думаю, это хорошо для начала. 🙂
Ответ №2:
То же самое мы можем достичь напрямую, используя метод replace. Без заполнения
df.replace(0,df.mean(axis=0),inplace=True)
Информация о методе:
Замените значения, указанные в «to_replace», на «value».
Значения фрейма данных заменяются другими значениями динамически. Это отличается от обновления с помощью .loc или .iloc которые требуют, чтобы вы указали местоположение для обновления с некоторым значением.
Комментарии:
1. Правильно ли я буду предположить, что при этом учитываются также значения 0? Например. если столбец имеет значения 1,0,2, 0 будет заменен на 1, а не на 1,5?
Ответ №3:
Как насчет перебора всех столбцов и их замены?
for col in df.columns:
val = df[col].mean()
df[col] = df[col].replace(0, val)
Комментарии:
1. обычно итерация выполняется очень медленно по сравнению с операциями с векторизованным массивом, которые встроены в pandas.