根据列表对列进行分类并汇总结果

时间:2020-07-21 19:59:04

标签: python pandas dataframe aggregate pandas-groupby

假设我有一个数据框,如下所示:

d = {'name': ['spain', 'greece','belgium','germany','italy'], 'davalue': [3, 4, 6, 9, 3]}
df = pd.DataFrame(data=d)
index name  davalue
0    spain      3
1    greece     4
2    belgium    6
3    germany    9
4    italy      3

我想基于名称列中的字符串列表进行汇总和求和。因此,例如,我可能有:southern=['spain', 'greece', 'italy']northern=['belgium','germany']

我的目标是使用sum进行汇总,并获得:

index name  davalue
0   southern    10
1   northen     15

其中10=3+4+315=6+9

我想象过类似的事情:

df.groupby(by=[['spain','greece','italy'],['belgium','germany']])

可能存在。 docs

标签或标签列表可以通过自身中的列传递给分组

但我不确定我是否理解语法的含义。

3 个答案:

答案 0 :(得分:3)

我会建立字典和地图:

d = {v:'southern' for v in southern}
d.update({v:'northern' for v in northern})

df['davalue'].groupby(df['name'].map(d)).sum()

输出:

name
northern    15
southern    10
Name: davalue, dtype: int64

答案 1 :(得分:2)

一种方法可能是使用np.select并将结果用作分组器:

import numpy as np

southern=['spain', 'greece', 'italy']
northern=['belgium','germany']

g = np.select([df.name.isin(southern),
               df.name.isin(northern)],
              ['southern', 'northern'],
              'others')

df.groupby(g).sum()

          davalue
northern       15
southern       10

答案 2 :(得分:1)

df["regional_group"]=df.apply(lambda x: "north" if x["home_team_name"] in ['belgium','germany'] else "south",axis=1)

您创建了一个新列,以后您可以以此为依据。

df.groupby("regional_group")["davavalue"].sum()