我有一个Date
列的数据框,我按年分组数据,我可以计算平均值和中位数。但是如何计算模式呢?这是我得到的错误:
>>> np.random.seed(0)
>>> rng = pd.date_range('2010-01-01', periods=10, freq='2M')
>>> df = pd.DataFrame({ 'Date': rng, 'Val': np.random.random_integers(0,100,size=10) })
>>> df
Date Val
0 2010-01-31 44
1 2010-03-31 47
2 2010-05-31 64
3 2010-07-31 67
4 2010-09-30 67
5 2010-11-30 9
6 2011-01-31 83
7 2011-03-31 21
8 2011-05-31 36
9 2011-07-31 87
>>> df.groupby(pd.Grouper(key='Date',freq='A')).mean()
Val
Date
2010-12-31 49.666667
2011-12-31 56.750000
>>> df.groupby(pd.Grouper(key='Date',freq='A')).median()
Val
Date
2010-12-31 55.5
2011-12-31 59.5
>>> df.groupby(pd.Grouper(key='Date',freq='A')).mode()
Traceback (most recent call last):
File "<pyshell#109>", line 1, in <module>
df.groupby(pd.Grouper(key='Date',freq='A')).mode()
File "C:\Python27\lib\site-packages\pandas\core\groupby.py", line 554, in __getattr__
return self._make_wrapper(attr)
File "C:\Python27\lib\site-packages\pandas\core\groupby.py", line 571, in _make_wrapper
raise AttributeError(msg)
AttributeError: Cannot access callable attribute 'mode' of 'DataFrameGroupBy' objects, try using the 'apply' method
答案 0 :(得分:2)
np.unique
与return_counts
参数一起使用。argmax
从唯一数组中获取值。np.apply_along_axis
获取自定义函数mode
def mode(a):
u, c = np.unique(a, return_counts=True)
return u[c.argmax()]
df.groupby(pd.Grouper(key='Date',freq='A')).Val.apply(mode)
Date
2010-12-31 67
2011-12-31 21
Freq: A-DEC, Name: Val, dtype: int64
答案 1 :(得分:1)
mode
不是内置函数,它与pandas groupby对象自动兼容。您可以使用scipy.stats
模块。不过,这感觉有点笨拙。
from scipy import stats
df.groupby(pd.Grouper(key='Date',freq='A')).apply(stats.mode)
或者,您可以使用value_counts()
函数并获取返回的第一个索引值。这是我要去的路线。
df.groupby(pd.Grouper(key='Date', freq='A')).value_counts()[0].index.values[0]
答案 2 :(得分:0)
mode就像其他人提到的那样是有问题的,但是可以像AttributeError建议的那样使用一个普通的lambda函数来应用DataFrameGroupby对象(并且不包含难看的切片或其他内容):
df.groupby(grouping_column)[[i for i in pivotable_columns]].apply(lambda x: x.mode())]