我是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
很明显,平均值的输出不正确。
谢谢。
答案 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系列进行数值计算