4
我有一個分組的DataFrame,我想與應該映射到某些列的函數字典進行聚合。對於單層列,這是直接與groups.agg({'colname': <function>})
。然而,我正在努力使這個工作與多級別的列,我只想參考一個單一的水平。具有多級別列的聚合組
這裏是一個例子。
讓我們做一些樣本數據:
import itertools
import pandas as pd
lev1 = ['foo', 'bar', 'baz']
lev2 = list('abc')
n = 6
df = pd.DataFrame({k: np.random.randn(n) for k in itertools.product(lev1,lev2)},
index=pd.DatetimeIndex(start='2015-01-01', periods=n, freq='11D'))
這看起來像:
bar baz foo
a b c a b c a b c
2015-01-01 -1.11 2.12 -1.00 0.18 0.14 1.24 0.73 0.06 3.66
2015-01-12 -1.43 0.75 0.38 0.04 -0.33 -0.42 1.00 -1.63 -1.35
2015-01-23 0.01 -1.70 -1.39 0.59 -1.10 -1.17 -1.51 -0.54 -1.11
2015-02-03 0.93 0.70 -0.12 1.07 -0.97 -0.45 -0.19 0.11 -0.79
2015-02-14 0.30 0.49 0.60 -0.28 -0.38 1.11 0.15 0.78 -0.58
2015-02-25 -0.26 0.51 0.82 0.05 -1.45 0.14 0.53 -0.33 -1.35
和分組的一個月:
groups = df.groupby(pd.TimeGrouper('MS'))
定義基於頂層部分功能在列中:
funcs = {'bar': np.sum, 'baz': np.mean, 'foo': np.min}
但是,做groups.agg(funcs)
會產生一個KeyError,因爲它需要每個級別的密鑰,這是有道理的。
這並不工作,例如:
groups.agg({('bar', 'a'): np.mean})
bar
a
2015-01-01 -0.845554
2015-02-01 0.324897
但我不希望指定在第二層的每個關鍵。所以我在尋找一些會的工作,如:
groups.agg({('bar', slice(None)): np.mean})
但因爲slice
不是可哈希不,當然工作,因此不能被放置在一本字典。
一種解決方法是:
def multifunc(group):
func = funcs[group.name[0]]
return func(group)
groups.agg(multifunc)
但是,這不是很可讀,也不顯得「Pandonic」給我。它也不允許與agg
功能在同一列上具有多種功能。必須有更好的/標準的方式來執行這樣的任務,它不是非常罕見的。
我開了一個問題來討論,如果我們想使這更容易:HTTPS: //github.com/pydata/pandas/issues/9585但是,我不確定什麼是最好的界面。我想'{'bar':np.sum,'baz':np.mean,'foo':np.min}'可以工作嗎?歡迎隨時加入! – joris 2015-03-04 09:27:11
謝謝Joris!有關這方面的討論肯定會很有趣。 Unutbu表明,總是有解決方法。但這意味着從Pandas界面退後一步,簡單的界面是Pandas如此驚人的合作的很大一部分。 – 2015-03-04 09:57:34