相关文章推荐
不羁的椰子  ·  python中PIL.Image,OpenC ...·  8 月前    · 
逆袭的墨镜  ·  19 函数进阶 | R语言教程·  1 年前    · 
纯真的毛衣  ·  JavaScript 输出 | 菜鸟教程·  1 年前    · 

dataframe.mean()的结果是不正确的

3 人关注

我在Python 2.7中工作,我有一个数据框架,我想得到名为'c'的列的平均数,但只有验证另一列的值等于某个值的行。 当我执行代码时,答案是意外的,但当我执行计算时,计算中位数,结果是正确的。

为什么平均值的输出是不正确的?

The code is the following:

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']
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()

The output:

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 个评论
你的列是dtype object ,它在做字符串连接然后分割,这一定是无意的......
@yatu [2,6,6]的中位数是6,这是正确的,但[2,6,6]的平均值不是86.6。
请把你帖子的最后一行 "很明显,媒体的输出是不正确的。"从媒体改为意思。
python
dataframe
mean
Sandra Guerrero
Sandra Guerrero
发布于 2019-05-02
1 个回答
user3483203
user3483203
发布于 2019-05-02
已采纳
0 人赞同

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()