Pandas: Как заменить нулевые значения в столбце средним значением этого столбца для всех столбцов с нулевым значением

#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.