dataframe.mean()的结果不正确

San*_*ero 3 python mean dataframe

我在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']
)
Run Code Online (Sandbox Code Playgroud)
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()
Run Code Online (Sandbox Code Playgroud)

输出:

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
Run Code Online (Sandbox Code Playgroud)
mean1
Out[2]: 86.0

mean2
Out[3]: 88.66666666666667

median1
Out[4]: 5.0

median2
Out[5]: 6.0
Run Code Online (Sandbox Code Playgroud)

显然,平均值的输出是不正确的。

谢谢。

use*_*203 6

熊猫在计算平均值时正在对“和”进行字符串连接,从示例框架中可以清楚地看出这一点。


>>> df[df.a == 'B'].c
3    2
4    6
5    6
Name: c, dtype: object
>>> 266 / 3
88.66666666666667
Run Code Online (Sandbox Code Playgroud)

如果您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()
Run Code Online (Sandbox Code Playgroud)

4.666666666666667
Run Code Online (Sandbox Code Playgroud)
In [17]: df.dtypes
Out[17]:
a     object
b      int64
c      int64
d    float64
dtype: object
Run Code Online (Sandbox Code Playgroud)

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