Результат dataframe.mean () неверен - PullRequest
3 голосов
/ 02 мая 2019

Я работаю в Python 2.7, у меня есть фрейм данных, и я хочу получить среднее значение столбца с именем 'c', но только те строки, которые подтверждают, что значения в другом столбце равны некоторому значению.Когда я выполняю код, ответ неожиданный, но когда я выполняю вычисление, вычисляя медиану, результат правильный.

Почему вывод среднего значения неверен?

Кодявляется следующим:

df = pd.DataFrame(
    np.array([['A', 1, 2, 3], ['A', 4, 5, np.nan], ['A', 7, 8, 9], ['B', 3, 2, np.nan], ['B', 5, 6, np.nan], ['B',5, 6, np.nan]]), 
    columns=['a', 'b', 'c', 'd']
)
df
mean1 = df[df.a == 'A'].c.mean()
mean2 = df[df.a == 'B'].c.mean()

median1 = df[df.a == 'A'].c.median()
median2 = df[df.a == 'B'].c.median()

Вывод:

df
Out[1]: 
   a  b  c    d
0  A  1  2    3
1  A  4  5  nan
2  A  7  8    9
3  B  3  2  nan
4  B  5  6  nan
5  B  5  6  nan
mean1
Out[2]: 86.0

mean2
Out[3]: 88.66666666666667

median1
Out[4]: 5.0

median2
Out[5]: 6.0

Очевидно, что вывод среднего значения является неправильным.

Спасибо.

1 Ответ

5 голосов
/ 02 мая 2019

Pandas выполняет конкатенацию строк для "суммы" при вычислении среднего значения, это ясно видно из вашего примера.


>>> df[df.a == 'B'].c
3    2
4    6
5    6
Name: c, dtype: object
>>> 266 / 3
88.66666666666667

Если вы посмотрите на dtype для вашего DataFrame, вы заметите, что все они object, хотя ни один Series не содержит смешанных типов. Это связано с объявлением вашего массива numpy. Массивы не должны содержать гетерогенные типы, поэтому по умолчанию для массива используется тип dtype object, который затем передается в конструктор DataFrame. Вы можете избежать этого, передав вместо конструктора список, который может содержать различные значения dtype без проблем.


df = pd.DataFrame(
    [['A', 1, 2, 3], ['A', 4, 5, np.nan], ['A', 7, 8, 9], ['B', 3, 2, np.nan], ['B', 5, 6, np.nan], ['B',5, 6, np.nan]],
    columns=['a', 'b', 'c', 'd']
)

df[df.a == 'B'].c.mean()

4.666666666666667

In [17]: df.dtypes
Out[17]:
a     object
b      int64
c      int64
d    float64
dtype: object

Я до сих пор не могу себе представить, что такое поведение предназначено, поэтому я считаю, что стоит открыть отчет о проблеме на странице разработки pandas, но в целом вам не следует использовать object dtype Series для численных расчетов.

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