2016-08-11 49 views
1

私はこのようになりますpd.DataFrameありますGROUPBY()とパンダにおける集約は

In [149]: df 
Out[149]: 
    AMOUNT  DATE ORDER_ID UID 
0 1001 2014-01-02  101 1 
1 1002 2014-01-03  102 3 
2 1003 2014-01-04  103 4 
3 1004 2014-01-05  104 5 
4 1005 2014-01-09  105 5 
5 1006 2014-01-07  106 7 
6 1007 2014-01-08  107 8 
7 1008 2014-01-09  108 5 
8 1009 2014-01-10  109 10 
9 1500 2014-01-09  110 5 

をし、私は1つの行に同じUIDとDATEに対応するすべての行を切り捨てるとの合計を使用したいです残る1行分のAMOUNT列の値。要するに

、所望の出力は次のようになります。本質的には

In [149]: df 
Out[149]: 
    AMOUNT  DATE ORDER_ID UID 
0 1001 2014-01-02  101 1 
1 1002 2014-01-03  102 3 
2 1003 2014-01-04  103 4 
3 1004 2014-01-05  104 5 
4 3513 2014-01-09  105 5 ## <- Rows that previously had index [7,9,4] are now truncated to this one row and the AMOUNT is the sum of of the AMOUNT values of those three rows 
5 1006 2014-01-07  106 7 
6 1007 2014-01-08  107 8 
8 1009 2014-01-10  109 10 

、私は何をしたいものに同じユーザーのUIDとDATEに対応して「集計」のすべての行であります他のすべての行はそのまま残してください。

私がこれまで試したことはこれです:どこ元dfに行くと「余分」を削除するには、いずれかの順序で起動するように、私はよく分からない

In [154]: df.groupby(['UID','DATE'])['AMOUNT'].sum() 
Out[154]: 
UID DATE  
1 2014-01-02 1001 
3 2014-01-03 1002 
4 2014-01-04 1003 
5 2014-01-05 1004 
    2014-01-09 3513 
7 2014-01-07 1006 
8 2014-01-08 1007 
10 2014-01-10 1009 
Name: AMOUNT, dtype: int64 

けど残りの1行に新しい合計値AMOUNTを割り当てる方法もありません。

ご協力いただきありがとうございます。

+0

ご迷惑をおかけして申し訳ございません。別のインデックスが必要ですか? – ayhan

+0

@ayhanこれを調べてくれてありがとう。私は実際にインデックスに興味を持っているわけではなく、効果的なやり方を見つけることができないという「切捨て」だけです。 – Thanos

答えて

1

私はあなたがaggregatesumfirstことができると思います:

print (df.groupby(['UID','DATE'], as_index=False).agg({'AMOUNT': sum, 'ORDER_ID': 'first'})) 

    UID  DATE AMOUNT ORDER_ID 
0 1 2014-01-02 1001  101 
1 3 2014-01-03 1002  102 
2 4 2014-01-04 1003  103 
3 5 2014-01-05 1004  104 
4 5 2014-01-09 3513  105 
5 7 2014-01-07 1006  106 
6 8 2014-01-08 1007  107 
7 10 2014-01-10 1009  109 
+0

これを調べていただきありがとうございます。あなたが示唆していることは、各グループの最初の行を維持することです(望み通りですが)前のすべての行の 'AMOUNT'値を集約することには何の効果もないと私には思えます。 – Thanos

+0

申し訳ありませんが、私に秒を与えます – jezrael

+0

私は前に '3513'が欠けていた、今それはいい仕事をすることができます。 – jezrael

2
df['AMOUNT'] = df.groupby(['UID','DATE'])['AMOUNT'].transform('sum') 
df = df.drop_duplicates(['UID', 'DATE']) 
df 
Out[21]: 
    AMOUNT  DATE ORDER_ID UID 
0 1001 2014-01-02  101 1 
1 1002 2014-01-03  102 3 
2 1003 2014-01-04  103 4 
3 1004 2014-01-05  104 5 
4 3513 2014-01-09  105 5 
5 1006 2014-01-07  106 7 
6 1007 2014-01-08  107 8 
8 1009 2014-01-10  109 10 
+0

ありがとう、とても助かりました。 – Thanos

+0

ようこそ。 :) – ayhan

1

また、あなたがaggregateを使用することができます。

In [10]: df.groupby(['UID', 'DATE']).agg({'AMOUNT': np.sum, 'ORDER_ID': lambda x: x.iloc[0]}).reset_index() 
Out[10]: 
    UID  DATE AMOUNT ORDER_ID 
0 1 2014-01-02 1001  101 
1 3 2014-01-03 1002  102 
2 4 2014-01-04 1003  103 
3 5 2014-01-05 1004  104 
4 5 2014-01-09 3513  105 
5 7 2014-01-07 1006  106 
6 8 2014-01-08 1007  107 
7 10 2014-01-10 1009  109 

は、あなただけの期待出力から "最初の" ORDER_IDをしたいと仮定すると、すなわち、 lambda x: x.iloc[0]

+0

ありがとうAnzel、それは非常に有用だった。 – Thanos

+0

@タノス、問題ではなく、私は助けてうれしいです。私はjezraelの答えが "sum"と "first"を使ってもっと直接的だと思う – Anzel