熊猫:将不同的功能应用于不同的列

pbr*_*ach 9 python aggregate pandas

当使用df.mean()时,我得到一个结果,其中给出了每列的平均值.现在让我们说我想要第一列的平均值,以及第二列的总和.有没有办法做到这一点?我不想拆卸和重新组装数据帧.

我最初的想法是按照pandas.groupby.agg()的方式做一些事情:

df = pd.DataFrame(np.random.random((10,2)), columns=['A','B'])
df.apply({'A':np.mean, 'B':np.sum}, axis=0)

Traceback (most recent call last):

  File "<ipython-input-81-265d3e797682>", line 1, in <module>
    df.apply({'A':np.mean, 'B':np.sum}, axis=0)

  File "C:\Users\Patrick\Anaconda\lib\site-packages\pandas\core\frame.py", line 3471, in apply
    return self._apply_standard(f, axis, reduce=reduce)

  File "C:\Users\Patrick\Anaconda\lib\site-packages\pandas\core\frame.py", line 3560, in _apply_standard
    results[i] = func(v)

TypeError: ("'dict' object is not callable", u'occurred at index A')
Run Code Online (Sandbox Code Playgroud)

但显然这不起作用.看起来传递一个字典会是一种直观的方式,但还有另一种方式(再次没有拆解和重新组装DataFrame)吗?

Bil*_*son 14

你可以试试一个闭包:

def multi_func(functions):
    def f(col):
        return functions[col.name](col)
    return f

df = pd.DataFrame(np.random.random((10, 2)), columns=['A', 'B'])
result = df.apply(multi_func({'A': np.mean, 'B': np.sum}))
Run Code Online (Sandbox Code Playgroud)


roc*_*vaj 10

我认为你可以使用agg以字典作为参数的方法。例如:

df = pd.DataFrame({'A': [0, 1, 2], 'B': [3, 4, 5]})

df =
A   B
0   0   3
1   1   4
2   2   5

df.agg({'A': 'mean', 'B': sum})

A     1.0
B    12.0
dtype: float64
Run Code Online (Sandbox Code Playgroud)

要补充的是,问题中提供的示例现在似乎也有效(从版本 1.5.3 开始)。

import numpy as np

df = pd.DataFrame(np.random.random((10,2)), columns=['A','B'])
df.apply({'A':np.mean, 'B':np.sum}, axis=0)

A    0.495771
B    5.939556
dtype: float64
Run Code Online (Sandbox Code Playgroud)