【问题标题】:The result of dataframe.mean() is incorrectdataframe.mean() 的结果不正确
【发布时间】:2019-09-21 03:22:22
【问题描述】:

我在 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

很明显,均值的输出是不正确的。

谢谢。

【问题讨论】:

  • 您的列是 dtype object,它正在执行字符串连接然后划分,这一定是无意的...
  • @yatu [2,6,6]的中位数是6,是正确的,但是[2,6,6]的平均值不是86.6。
  • 请更改您帖子的最后一行“很明显,媒体的输出不正确。”从媒体到意思。

标签: python dataframe mean


【解决方案1】:

在计算平均值时,Pandas 正在对“sum”进行字符串连接,从您的示例框架中可以清楚地看到这一点。


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

我仍然无法想象这种行为是有意的,所以我认为值得在 pandas 开发页面上打开问题报告,但一般来说,你不应该使用 object dtype 系列进行数值计算。

【讨论】:

    猜你喜欢
    • 2014-06-19
    • 2013-03-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多