2015-12-02 69 views
1

對於簡單問題的道歉,我是一個對Python比較新的R用戶。在使用索引的函數上聚合失敗

考慮以下最小例如:

df = pd.DataFrame({'A' : ['foo', 'bar', 'foo', 'bar', 
           'foo', 'bar', 'foo', 'foo'], 
        'B' : ['one', 'one', 'two', 'three', 
           'two', 'two', 'one', 'three'], 
        'C' : range(0,8), 
        'D' : range(0,8)}) 

以下引發錯誤:

def myf(x): 
    return x[2] 

df[["A","C","D"]].groupby('A').aggregate(myf) 

所需的輸出將是一個熊貓表如下所示:

| A  | myf C | myf D | 
------------------------- 
| foo | 2  | 2  | 
| bar | 3  | 3  | 

從評論和文檔,似乎可以做一些事情:

def myf(x): 
    return x.first 

得到的第一項,但它不清楚如何構建一個非內置的方法,仍然會得到適當的索引值。例如:

def myf(x): 
    return Series(x[1], index=x.index) 

似乎不起作用。

+0

你能否提供數值數據和你想要的輸出? – Alexander

+0

提示:在你的函數中加入'print(x)',然後問你想用'x [1]'來處理那個'x'。 – DSM

+0

@亞歷山大我沒有關注。我確實提供了數字數據。我的問題包括一個隨機生成數值的最小示例數據框;在一些'pandas'文檔中使用了相同的例子。 – cynewulf

回答

1

Aggregation文檔 -

Aggregating functions are ones that reduce the dimension of the returned objects, for example: mean, sum, size, count, std, var, sem, describe, first, last, nth, min, max. This is what happens when you do for example DataFrame.sum() and get back a Series.

如果你關注@ DSM的建議,並添加print(x)myf,你會發現你會從原始DataFrame通過與index一個Series。因此,如果您通常要求x[1],則某些Series將不具有index

你可以做return x.iloc[0]所以你依靠位置而不是基於標籤的索引。換句話說,您選擇組合的Series中的第一個項目,而不是原始DataFrame中恰好具有標籤「1」的項目。

+0

感謝您的解釋,但我仍然有點困惑。那麼我怎麼能修改上面的代碼來回饋列表中的第一項呢? (我已經添加了我的實際用例,這對上面的問題來說稍微不重要); – cynewulf

+0

您可以執行'return x.iloc [0]',這樣您就可以依賴位置,而不是基於標籤的索引。換句話說,您選擇了分組''系列'中的第一個項目,而不是原來的'DataFrame'中恰好具有標籤'1'的項目。 – Stefan

+0

謝謝,這很完美。不熟悉'iloc'。也許把它添加到你的答案,這很清楚? – cynewulf