2014-10-17 71 views
5

当使用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') 

但显然这是行不通的。看起来像传递一个字典将是一个直观的方式,但有没有另一种方式(同样没有反汇编和重新组装DataFrame)?

回答

1

我想你可以使用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 
11

你可以尝试关闭:

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})) 
+0

实际上这很不错。我的解决方法是在数据框中插入一列,在该列上执行groupby,然后将字典传递给聚合方法。 – pbreach 2014-10-18 03:37:51

+0

谢谢!我注意到,如果DataFrame中的字段数多于函数字典中的字段,则会失败。 @ bill-letson你也看过吗? – 2016-10-20 12:36:19

+0

完整的实现应该包含一个返回标识函数的尝试KeyError子句:lambda x:x – 2017-01-03 16:47:01

1

就遇到这种情况我和具有以下想出了:

In [1]: import pandas as pd 

In [2]: df = pd.DataFrame([['one', 'two'], ['three', 'four'], ['five', 'six']], 
    ...:     columns=['A', 'B']) 

In [3]: df 
Out[3]: 
     A  B 
0 one two 
1 three four 
2 five six 

In [4]: converters = {'A': lambda x: x[:1], 'B': lambda x: x.replace('o', '')} 

In [5]: new = pd.DataFrame.from_dict({col: series.apply(converters[col]) 
    ...:        if col in converters else series 
    ...:        for col, series in df.iteritems()}) 

In [6]: new 
Out[6]: 
    A B 
0 o tw 
1 t fur 
2 f six 
相关问题