蟒蛇熊猫在求和后重新关联非数字数据



所以我们有一些这样的数据集:

email, name, price, quantity
a@a.com, alan, 5.3, 2
b@a.com, barbara, 3.99, 1
b@a.com, barbara, 1, 1
...
z@z.com, zed, 3, 1

所以现在如果我们在数据帧中拥有它,那么很容易做到

df.groupby(['email']).sum()
          price     quantity
email
a@a.com    5.3      2
b@a.com   4.99      2

所以不,我们有数字有趣的部分,但没有文本部分。如何将文本部分与总和合并回去?

因此,所需的最终状态将是这样的:

email, name, price_sum, quantity_sum
a@a.com, alan, 5.3, 2
b@b.com, barbara, 4.99, 2
...
z@z.com, zed, 3, 1

我会使用DataFrameGroupBy.agg()方法。

演示:

In [29]: df
Out[29]:
   group    email     name  price  quantity
0      1  a@a.com     alan   5.30         2
1      2  b@a.com  barbara   3.99         1
2      2  b@a.com  barbara   1.00         1
3      1  c@x.com      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  a@a.com, c@x.com         2
2       4.99  b@a.com, b@a.com         1

或@IgorRaush评论中提议使用 as_index=False

In [32]: df.groupby('group', as_index=False).agg(funcs)
Out[32]:
   group  price             email  quantity
0      1   6.40  a@a.com, c@x.com         2
1      2   4.99  b@a.com, b@a.com         1

您可以通过采用第一个值来聚合名称。

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

或者,您可以将名称聚合到字典中。

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

或者,如果您希望添加为字符串。

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

但是,对于您的电子邮件名称组合相同的特定情况,您可以按照Igor Raush的建议df.groupby(['name', 'email'], as_index=False).sum()