2017-01-05 2 views
3

次のようにグループ化ロジックを詳しく説明します。データフレームdf考える:平均とカウントによる条件付きグループ化

df = 

    ID GROUP DAY GRADE TIME_1 
    1 AAA 1 5  20 
    1 AAA 1 4  19 
    1 AAA 1 3  21 
    1 BBB 2 1  10 
    2 BBB 2 3  13 

私は、グループ内の行数、IDGRADEGROUPDAYによってグループ行する必要があり、平均TIME_1を計算します。また、これは私の質問です。GRADEが4か5かどうかをチェックしたいのですが、正のグレードにグルーピングし、TIME_1を計算する必要があります。

結果はこのようになります。

result = 

    GROUP DAY AVG_TIME_1_POSITIVE AVG_TIME_1_NEGATIVE QTY_POSITIVE QTY_NEGATIVE 
    AAA 1 19.5     21     2    1 
    BBB 2 0     11.5     0    2 

私はこのアプローチを使用していますが、GRADEによってグルーピング条件を指定する方法がわからない:

result = df.groupby(['GROUP','GRADE','DAY']).agg({'TIME_1': 'mean', 
        'ID': 'count'}).reset_index() 

答えて

2

一つの可能​​な解決策は、boolean indexingで、 concat

mask = df.GRADE.isin([4,5]) 
result1 = df[mask].groupby(['GROUP','DAY']).agg({'TIME_1': 'mean', 
        'ID': 'count'}).add_suffix('_POSITIVE') 

print (result1) 
      TIME_1_POSITIVE ID_POSITIVE 
GROUP DAY        
AAA 1    19.5   2 

result2 = df[~mask].groupby(['GROUP','DAY']).agg({'TIME_1': 'mean', 
        'ID': 'count'}).add_suffix('_NEGATIVE') 

print (result2) 
      TIME_1_NEGATIVE ID_NEGATIVE 
GROUP DAY        
AAA 1    21.0   1 
BBB 2    11.5   2 

print (pd.concat([result1, result2], axis=1)) 
      TIME_1_POSITIVE ID_POSITIVE TIME_1_NEGATIVE ID_NEGATIVE 
GROUP DAY                
AAA 1    19.5   2.0    21.0   1 
BBB 2    NaN   NaN    11.5   2 
+0

難しい質問。 'print(type(mask))' - 'Series'ですか? – jezrael

2

あなたはcですまた、私には

qty_pos = df.groupby(['GROUP','GRADE','DAY']).agg({'GRADE': lambda x: sum(x>3)}) 
qty_neg = df.groupby(['GROUP','GRADE','DAY']).agg({'GRADE': lambda x: sum(x<=3)}) 
result['QTY_POSITIVE'] = qty_pos 
result['QTY_NEGATIV'] = qty_neg 
0

ようagg何かに関数を渡すあなたが手動で分割する必要がある場合、それはニシキヘビではありません、あなたが分割apply-を行うことになっているGROUPBYを(使用した後のデータフレームを適用し、組み合わせ私たちのために仕事を組み合わせる)。だから私は問題は、データフレームをグループ化するための適切な鍵を策定する方法だと思います。

入力:

df=df.set_index(['GROUP','DAY', 'GRADE'],drop=False) 
key=lambda x: (x[0],x[1], 'positive' if x[2] in [4,5] else 'negative') 
df.groupby(key).agg({'TIME_1': 'mean', 'ID': 'count'}) 

出力:データなし

    TIME_1 ID 
(AAA, 1, negative) 21.0 1 
(AAA, 1, positive) 19.5 2 
(BBB, 2, negative) 11.5 2 
関連する問題