Пакет статистики Python mean () дает неправильный ответ из фрейма данных pandas

Я использую Python 3.6, пытаясь получить среднее значение некоторых значений в подмножестве строки фрейма данных pandas (версия pandas 0.23.4). Я получаю значения с помощью .loc [], а затем пытаюсь получить среднее из них с помощью mean () из пакета статистики python, например:

import statistics as st
rows = ['row1','row2','row3']
somelist = []
for i in rows:
    a = df.loc[i,"Q1":"Q7"]
    somelist.append(st.mean(a))

Я получаю ответы без десятичных знаков. Если я вручную запишу ответы на вопросы Q1: Q7 в список, то результат будет следующим:

a = st.mean([2,3,4,4,2,6,5])
print(a)
Out: 3.7142857142857144

Но если эта последовательность была тем, что я извлек из фрейма данных, я получаю среднее значение без десятичных знаков, например:

a = st.mean(df.loc[i,"Q1":"Q7"])
Out: 3

Очевидно, это потому, что он думает, что это numpy.int64 вместо float. Это происходит, даже если я конвертирую фрагмент из фрейма данных в список, например:

a = st.mean(list(df.loc[i,"Q1":"Q7"]))
Out: 3

Как ни странно, этого НЕ происходит, если я использую .mean ():

a = df.loc[i,"Q1":"Q7"].mean()
Out: 3.7142857142857144

Я дважды проверил метод st.stdev (), и, похоже, он работает нормально. В чем дело? Почему он хочет автоматически распечатать целое число для среднего? Спасибо!

Другой простой пример: st.mean([np.int64(1), np.int64(2)]) возвращает 1, а не 1,5.

Warren Weckesser 09.11.2018 02:40
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
1
763
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Я думаю, что вы делаете что-то не так. Попробуйте напечатать a для каждой строки, которую вы просматриваете, и добавленное среднее значение в списке.

Спасибо за Ваш ответ. На самом деле это все еще происходит вне цикла for, через!

Ellie Hanna 09.11.2018 02:38

Какие значения вы получаете, когда печатаете somelist после завершения цикла, потому что я вижу, что у вас есть 3 строки, но после этого вы помещаете 7 элементов для вычисления среднего значения.

Marko Maksimovic 09.11.2018 02:43

элементы взяты из столбца под названием Q1 в столбец под названием Q7 (так что для примера игрушки, который я сделал там, было бы 3 строки, но я ищу среднее значение каждой строки по 7 столбцам)

Ellie Hanna 09.11.2018 02:45
Ответ принят как подходящий

statistics.mean преобразует выходной сигнал в тот же тип, что и входной. Если все входные значения, скажем, numpy.int64, результат преобразуется в numpy.int64. Вот исходный код statistics.mean в Python 3.6.7:

def mean(data):
    """Return the sample arithmetic mean of data.

    >>> mean([1, 2, 3, 4, 4])
    2.8

    >>> from fractions import Fraction as F
    >>> mean([F(3, 7), F(1, 21), F(5, 3), F(1, 3)])
    Fraction(13, 21)

    >>> from decimal import Decimal as D
    >>> mean([D("0.5"), D("0.75"), D("0.625"), D("0.375")])
    Decimal('0.5625')

    If ``data`` is empty, StatisticsError will be raised.
    """
    if iter(data) is data:
        data = list(data)
    n = len(data)
    if n < 1:
        raise StatisticsError('mean requires at least one data point')
    T, total, count = _sum(data)
    assert count == n
    return _convert(total/n, T)

Обратите внимание, что total/n перед возвратом преобразуется во входной тип.

Чтобы избежать этого, вы можете преобразовать входные данные в числа с плавающей запятой перед их передачей в statistics.mean.

Отлично, спасибо - я сделал из них поплавки, и это сработало!

Ellie Hanna 09.11.2018 02:48

Другие вопросы по теме