2017-01-25 4 views
0

だから我々はこのようなデータのいくつかのセットを持っている:我々はデータフレームでこれを持っている場合、それが何を非常に簡単ですだから今のpythonパンダ再アソシエート非数値データを加算した後

email, name, price, quantity 
[email protected], alan, 5.3, 2 
[email protected], barbara, 3.99, 1 
[email protected], barbara, 1, 1 

... 

[email protected], zed, 3, 1 

df.groupby(['email']).sum() 

      price  quantity 
email 

[email protected] 5.3  2 
[email protected] 4.99  2 

私たちは数字の興味深い部分は持っていますが、テキスト部分はありません。どのようにしてテキスト部分を合計して合併することができますか?

だからこれの所望の最終状態は次のようなものになるだろう:

email, name, price_sum, quantity_sum 
[email protected], alan, 5.3, 2 
[email protected], barbara, 4.99, 2 
... 
[email protected], zed, 3, 1 
+0

で行くことができる所望の出力であなたの質問を編集してください。 「テキスト部分」をデータフレームにどのように表示したいですか? –

+0

なぜ 'df.groupby(['name'、 'email']、as_index = False).sum()'だけではないのですか? –

+0

ああ、これは単純化された例ですが、実際には住所などのようにこれに関連付けられた複数の文字列があります。私たちはまた、人々がいつも同じように電子メールを常に同じものにすることを「信頼」していますが、他のデータには一貫性がないかもしれません:住所の「西3番街」v「3番街」 –

答えて

0

あなたは最初の値を取ることによって、名前を集約できます。

In [283]: df.groupby('email').agg({'price': sum, 'quantity': sum, 'name': 'first' 
    ...: }) 
Out[283]: 
     price  name quantity 
email 
[email protected] 5.30  alan   2 
[email protected] 4.99 barbara   2 

また、名前をdictに集約することもできます。

In [281]: df.groupby('email').agg({'price': sum, 'quantity': sum, 'name': lambda x 
    ...: : x.value_counts().to_dict()}) 
Out[281]: 
     price    name quantity 
email 
[email protected] 5.30  {u'alan': 1}   2 
[email protected] 4.99 {u'barbara': 2}   2 

または、文字列として追加する場合は、

In [282]: df.groupby('email').agg({'price': sum, 'quantity': sum, 'name': sum }) 
Out[282]: 
     price   name quantity 
email 
[email protected] 5.30   alan   2 
[email protected] 4.99 barbarabarbara   2 

しかし、あなたの電子メール名の組み合わせが同じである特定の場合のために、あなたはイゴールRaushの提案df.groupby(['name', 'email'], as_index=False).sum()

+0

すてきな提案、ありがとう! –

1

私はDataFrameGroupBy.agg()メソッドを使用すると思います。

デモ:

In [29]: df 
Out[29]: 
    group email  name price quantity 
0  1 [email protected]  alan 5.30   2 
1  2 [email protected] barbara 3.99   1 
2  2 [email protected] barbara 1.00   1 
3  1 [email protected]  joe 1.10   2 

In [30]: funcs = {'email':', '.join, 'price':'sum', 'quantity':'mean'} 

In [31]: df.groupby('group').agg(funcs) 
Out[31]: 
     price    email quantity 
group 
1  6.40 [email protected], [email protected]   2 
2  4.99 [email protected], [email protected]   1 

または@IgorRaush proposed in the comment using as_index=Falseなど:

In [32]: df.groupby('group', as_index=False).agg(funcs) 
Out[32]: 
    group price    email quantity 
0  1 6.40 [email protected], [email protected]   2 
1  2 4.99 [email protected], [email protected]   1 
+1

少しシンプルです。 '{'email': '、'。join}'は 'lambda'を避けます。 –

+0

@IgorRaush、良い点、ありがとう!私は答えでそれを修正しました – MaxU

+0

これは興味深いものです。パンダは非常に柔軟で、 –

関連する問題