dataframe.mean()的结果不正确

时间:2019-05-02 15:02:00

标签: python dataframe mean

我是Python 2.7中的workint,我有一个数据框,我想获取称为'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 个答案:

答案 0 :(得分:5)

Pandas在计算均值时正在对“和”进行字符串连接,这很容易从示例框架中看到。


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

如果查看DataFrame的dtype,即使没有一个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

我仍然无法想象这种行为是故意的,因此,我认为值得在熊猫开发页面上打开问题报告,但总的来说,您不应该使用object dtype系列进行数值计算