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






Я думаю, что вы делаете что-то не так. Попробуйте напечатать a для каждой строки, которую вы просматриваете, и добавленное среднее значение в списке.
Спасибо за Ваш ответ. На самом деле это все еще происходит вне цикла for, через!
Какие значения вы получаете, когда печатаете somelist после завершения цикла, потому что я вижу, что у вас есть 3 строки, но после этого вы помещаете 7 элементов для вычисления среднего значения.
элементы взяты из столбца под названием Q1 в столбец под названием Q7 (так что для примера игрушки, который я сделал там, было бы 3 строки, но я ищу среднее значение каждой строки по 7 столбцам)
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.
Отлично, спасибо - я сделал из них поплавки, и это сработало!
Другой простой пример:
st.mean([np.int64(1), np.int64(2)])возвращает 1, а не 1,5.