2014-10-17 63 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 
相關問題