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