1 Вопрос: Результат dataframe.mean () неверен

вопрос создан в Thu, May 2, 2019 12:00 AM

Я работаю в 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

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

Спасибо.

    
3
  1. Ваши столбцы - dtype object, выполняется конкатенация строк, а затем деление, это должно быть непреднамеренно ...
    2019-05-02 15: 04: 52Z
  2. @ yatu медиана [2,6,6] равна 6, это правильно, но среднее значение [2,6,6] не равно 86,6.
    2019-05-02 15: 09: 18Z
  3. Пожалуйста, измените последнюю строку вашего сообщения: «Очевидно, что выходные данные мультимедиа неверны». из средств массовой информации значит.
    2019-05-02 15: 13: 38Z
  4. @ r_hudson спасибо.
    2019-05-02 15: 15: 27Z
1 ответ                              1                         

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 для численных расчетов.

    
5
2019-05-02 15: 13: 11Z
  1. Большое спасибо !!
    2019-05-02 15: 18: 04Z
источник размещен Вот