mean of absolute value of groupby object pandas

2019-07-25 12:38发布

问题:

I want to compute the mean of the absolute value of a grouped object.

I.e.

grouped = df.groupby([pd.TimeGrouper(3MS)])

dct['x'] = grouped['profit'].agg('mean') / grouped['cost'].abs().agg('mean')

However, the above code results in an error. I have tried various variants of the above code but so far all result in errors.

There must be a simple way to do this.

Update:

This is the dataframe that is grouped vi pd.TimeGrouper(3MS). I want to take the absolute value of column cost 1, and then compute the mean.

            cost1  cost2  cost3  cost4  
date                                                                       
2016-03-31       -490.60        -118.10         -344.87           -91.44   
2016-04-30       -188.74         -55.99         -259.23           -75.16   
2016-05-31       -158.62         -43.58         -176.37           -21.98 

I tried to do grouped['cost1'].abs().mean() but I got:

/Users/User1/anaconda/lib/python2.7/site-packages/pandas/core/groupby.pyc in __getattr__(self, attr)
    493             return self[attr]
    494         if hasattr(self.obj, attr):
--> 495             return self._make_wrapper(attr)
    496 
    497         raise AttributeError("%r object has no attribute %r" %

/Users/User1/anaconda/lib/python2.7/site-packages/pandas/core/groupby.pyc in _make_wrapper(self, name)
    507                    "using the 'apply' method".format(kind, name,
    508                                                      type(self).__name__))
--> 509             raise AttributeError(msg)
    510 
    511         # need to setup the selection

AttributeError: ("Cannot access callable attribute 'abs' of 'SeriesGroupBy' objects, try using the 'apply' method", u'occurred at index 0')

回答1:

Based on your update, I think you are looking for one mean taken on absolute values for the group.

Using grouped.apply(abs).mean() will apply the abs function to values in your group (cost1 etc), and the mean will give you the average for whatever your grouping variable is.

You could also just apply the abs function before grouping, and then use the mean function directly.



回答2:

You're probably getting the error because you can't use .agg on a Sereis object.

You didn't post your grouped object so I don't know if there are other issues but you should try it this way. I think this should work:

dct['x'] = grouped['profit'].mean() / grouped['cost'].abs().mean()