2017-09-09 4 views
0

特定の列を選択しにより、私のグループがITEM_ID使用した後にのみここre_order = 1としてつの列データを選択し、次いで、別の列を有していなければならない方法パンダグループIは、入力されたデータフレームを有する

df_orders = pd.DataFrame({'item_id': [1, 1, 2, 2, 3, 4, 4, 5, 7, 8], 
         're_order':[0, 1, 0, 1, 1, 0, 1, 1, 1, 0], 
         'count':[27, 49, 3, 1, 6, 8, 14, 1, 1, 6] }, 
         columns=['item_id', 're_order', 'count']) 
or 

    item_id re_order count 
0  1   0  27 
1  1   1  49 
2  2   0  3 
3  2   1  1 
4  3   1  6 
5  4   0  8 
6  4   1  14 
7  5   1  1 
8  7   1  1 
9  8   0  6 
10  8   1  7 

総数?

マイ所望の出力

item_id reor_count tot_count 
0  1   49   76 
1  2   1   4 
2  3   6   6 
3  4   14   22 
4  5   1   1 
5  7   1   1 
6  8   7   13 

私は

df_orders_tot_count = df_orders.groupby('item_id')['count'].agg(['sum']).rename(columns={'sum': 'tot_count'}).reset_index() 

     item_id tot_count 
0   1   76 
1   2   4 
2   3   6 
3   4   22 
4   5   1 
5   7   1 
6   8   13 

を使用して合計カウント(tot_count)を見つけることができていますが、Python的な方法を使用してreor_count列を生成するための難しさを持っています。どんな助けもありがとう!

答えて

1

あなたはcountre_orderを乗じてre_order列を事前計算して、groupby.sumを行うことができます。

(df_orders.assign(re_order = df_orders['re_order'] * df_orders['count']) 
.groupby('item_id', as_index=False).sum()) 

# item_id re_order count 
#0  1  49  76 
#1  2  1   4 
#2  3  6   6 
#3  4  14  22 
#4  5  1   1 
#5  7  1   1 
#6  8  0   6 

名前を変更した列名好む場合:

(df_orders.assign(re_order = df_orders['re_order'] * df_orders['count']) 
.groupby('item_id', as_index=False).sum() 
.rename(columns={'re_order': 'reor_count', 'count': 'tot_count'})) 
+0

ありがとう@Psidom。それは魅力として働く。私はaggを使用しようとしました、フィルターをかけ、他の試みをカップルしましたが、今まで理解できませんでした。私は利用可能なリソースの数が多いことを知っています、特にパンダマニュアルとstackoverflow自体から。そして私は、「正しい」アプローチは経験からも来ていると信じています。しかし、あなたはフィールドの初心者のためにこのタイプの問題に将来どのように取り組むべきかについて光を当てることができますか? – udothemath1984

0

をあなたはこの

df.sort_values(['item_id','re_order']).groupby(['item_id'])['count'].agg({'count':'sum','re_order':'last'}) 
Out[244]: 
     re_order count 
item_id     
1    49  76 
2    1  4 
3    6  6 
4    14  22 
5    1  1 
7    1  1 
8    6  6 
を試すことができます
+0

ありがとう@Wen。提案された方法は、現在の例のために働く。しかし、完全な表のいくつかの項目は、再注文項目を持たないか、re_orderは常に0です。この場合、agg({'re_order': 'last'})は機能しません。 – udothemath1984

関連する問題