当DataFrame包含对象时,pandas groupby数字函数将数字强制转换为对象

时间:2014-05-01 06:05:20

标签: python pandas

我在具有混合类型(数字和对象)的DataFrame上使用Pandas groupby函数。

>>> import pandas as pd
>>> 
>>> d = {
...  "sales": {
...   "0": 3963.0,
...   "1": 2312.7,
...  },
...  "Id": {
...   "0": 10001,
...   "1": 10003,
...  },
...  "Blah": {
...   "0": "Blah1",
...   "1": "Blah2",
...  }
... }
>>> 
>>> d=pd.DataFrame(d)
>>> 
>>> print d.dtypes
Blah      object
Id         int64
sales    float64
dtype: object

当我将数字函数应用于组时,例如max()或mean(),我得到一个返回类型object的DataFrame

>>> print d.groupby('Id').max()['sales']
Id
10001    3963.0
10003    2312.7
Name: sales, dtype: object

当我首先只选择数字列然后将数字函数应用于组时,例如max()或mean(),我得到一个数字类型的DataFrame

>>> print d[['sales','Id']].groupby('Id').max()['sales']
Id
10001    3963.0
10003    2312.7
Name: sales, dtype: float64

第二个结果是我所期望的 - 或者我不明白为什么将数字函数maxmean应用于具有非数字类型的数据框会强制数值到对象。

例如,如果原始数据框中没有非数字对象类型,则不会以奇怪的方式强制执行类型:

>>> del d['Blah']
>>> d[['Id','sales']].groupby('Id').max()['sales']
Id
10001    3963.0
10003    2312.7
Name: sales, dtype: float64
>>> d.groupby('Id').max()['sales']
Id
10001    3963.0
10003    2312.7
Name: sales, dtype: float64
>>> 

编辑 - 这是我的版本信息:

Mac OS X 10.9 w/ Python 2.7.6
Cython==0.19.2
matplotlib==1.3.1
numpy==1.8.0
pandas==0.13.1
scipy==0.13.0

1 个答案:

答案 0 :(得分:2)

不要记得这个问题是什么时候修复的,但在master / 0.14(即将推出)中是正确的。

In [48]: d
Out[48]: 
    Blah     Id   sales
0  Blah1  10001  3963.0
1  Blah2  10003  2312.7

[2 rows x 3 columns]

In [49]: d.dtypes
Out[49]: 
Blah      object
Id         int64
sales    float64
dtype: object

In [50]: d.groupby('Id').max()['sales']
Out[50]: 
Id
10001    3963.0
10003    2312.7
Name: sales, dtype: float64