所以我们有一些这样的数据集:
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()