2013-11-21 54 views
2

我用我的數據框df其中有列typesubtype,和11人大熊貓groupby。然後我打電話跟我combine_function的組(需要一個更好的名字)像apply熊貓GROUPBY應用功能,結合了某些羣體,但不是別人

grouped = df('type') 
    reduced = grouped.apply(combine_function) 

在我的combine_function檢查該組中的任何元素包含給定亞型的任何元素,比如說1,和看起來像:

def combine_function(group): 
    if 1 in group.subtype: 
     return aggregate_function(group) 
    else: 
     return group 

combine_function然後可以調用一個aggregate_function,計算彙總統計,並將其存儲在第一行,然後設置該行是小組。它看起來像:

def aggregate_function(group): 
    first = group.first_valid_index() 
    group.value1[group.index == first] = group.value1.mean() 
    group.value2[group.index == first] = group.value2.max() 
    group.value3[group.index == first] = group.value3.std() 

    group = group[(group.index == first)] 
    return group 

我相當肯定這是不是要做到這一點的最好辦法,但它一直給我所期望的結果中,99.9%的時間上千種DataFrames的。然而,它有時拋出以某種方式有關,我不想聚集一團的誤差都只有2行:

ValueError: Shape of passed values is (13,), indices imply (13, 5) 

在我的例子組有大小:

In [4]: grouped.size() 
Out[4]: 
type 
1   9288 
3   7667 
5   7604 
11   2 
dtype: int64 

它處理三三罰款,然後當它試圖把所有的東西結合起來的時候出現了錯誤。如果我註釋掉group = group[(group.index == first)]那麼更新但不彙總或在所有組上調用我的aggregate_function它很好。

有誰知道正確的方式來做這種聚合的一些羣體,而不是其他人?

+0

您是否嘗試過使用apply? –

回答

3

您的aggregate_functions看起來扭曲了我。當你聚合一個組時,它會自動減少到一行;你不需要手動完成。也許我錯過了這一點。 (你在做與我不理解指數一些特別的東西?),但較正常的使用情況是這樣的:

agg_condition = lambda x: Series([1]).isin(x['subtype]').any() 
agg_functions = {'value1': np.mean, 'value2': np.max, 'value3': np.std} 

df1 = df.groupby('type').filter(agg_condition).groupby('type').agg(**agg_functions) 
df2 = df.groupby('type').filter(~agg_condition) 

result = pd.concat([df1, df2]) 

注:agg_condition是凌亂的,因爲:(1)內置Python in指一個系列的索引,而不是它的值,以及(2)結果必須減少到一個標量any()

+0

這看起來像我應該做的。我昨天玩了一些,但它仍然爲我踢了很多錯誤。我認爲這與我處理其他8列的情況有關,因爲我只想彙總使用第一個值。我確信有一個簡單的解決方法,一旦我有它的工作,我會更新。 – TristanMatthews