Пакет статистики Python Mean () дает неправильный ответ от pandas dataframe - PullRequest
0 голосов
/ 09 ноября 2018

Я использую Python 3.6, пытаясь получить среднее значение некоторых значений в подмножестве строки кадра данных панд (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 (), и он, кажется, работает нормально. В чем дело? Почему он хочет автоматически распечатать целое число для среднего? Спасибо!

Ответы [ 2 ]

0 голосов
/ 09 ноября 2018

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.

0 голосов
/ 09 ноября 2018

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...