首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在pandas中使用Groupby和sum进行重复操作

在pandas中使用Groupby和sum进行重复操作
EN

Stack Overflow用户
提问于 2018-09-05 20:06:00
回答 1查看 153关注 0票数 2

一段时间以来,我一直在尝试解决以下问题。希望有人能帮帮我。我试着总结不同地区的数字(例如出生人数)。如下表所示,我有一个数据集,其中作为示例,区域1和区域2在融合的area4中聚在一起。Area3不受影响。

代码语言:javascript
复制
import pandas as pd
data1  = { 
"OldArea" : ['area1','area2','area3'],
"numbercount" : [10,20,5],
"FusedIntoArea" : ['area4','area4','area3']
}
frame1 = pd.DataFrame(data1, columns=['OldArea', 'FusedIntoArea', 'numbercount'])
frame1

我想将area1和area2 (10 + 20)的数字加到区域4 (30)中。area3的数字计数保持不变(5)。这是通过使用groupby和sum获得一个pd.series series1来实现的,如下所示。

代码语言:javascript
复制
series1 = frame1.groupby(['FusedIntoArea'])['numbercount'].sum()
series1

问题是,我想在几年内将这个groupby和sum操作扩展到几个区域的融合。这些区域的扩展融合数据显示在frame3中。Area1和area2融合成了area4 (就像以前一样),但现在有了更多:在那之后的一年里,area4和area3融合成了area5,而area6多年来保持不变。融合数据的格式类似于下面frame2中的格式:

代码语言:javascript
复制
data2 = {
'year0' : ['area1', 'area2', 'area3', 'area6'],
'year1' : ['area4', 'area4', 'area3', 'area6'],
'year2' : ['area5', 'area5', 'area5', 'area6']
}
frame2 = pd.DataFrame(data2, columns = ['year0', 'year1', 'year2'])
frame2

现在,数字计数的数据(例如,融合前或融合后的出生)在一个单独的框架中,frame3。

代码语言:javascript
复制
data3  = { 
"area" : ['area1', 'area2','area3', 'area4', 'area5', 'area6'],
"numbercount" : [10,20,5,35, 15,25],
}
frame3 = pd.DataFrame(data3, columns=['area', 'numbercount'])
frame3

我试图得到的结果是新形成的areas5的总数(TotalNumber) (融合后为1+2+3+4+5)和6(多年未变),如frame4中所示。任何帮助都是非常感谢的。我应该使用连接或合并操作吗?提前谢谢。

代码语言:javascript
复制
data4  = { 
    "OldAreas" :[1,2,3,4,5,6],
    "NewArea" : ['area5','area5','area5','area5','area5','area6'],
    "TotalNumber" : [85,85,85,85,85, 25]
}
frame4 = pd.DataFrame(data4, columns=['NewArea', 'TotalNumber'])
frame4
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-09-05 20:50:20

您可以使用字典来映射现有数据。

首先创建一个字典,告诉你它在哪个区域融合的每个区域:

代码语言:javascript
复制
areas_to_fuse = dict(zip(frame2.year0.values, frame2.year2.values))
areas_to_fuse = {**areas_to_fuse,**dict(zip(frame2.year1.values, frame2.year2.values))}


{'area1': 'area5',
 'area2': 'area5',
 'area3': 'area5',
 'area4': 'area5',
 'area6': 'area6'}

完成此操作后,您可以通过在frame3['area']上使用replace来创建NewArea列(请注意,replace允许保留字典的键中没有的值,如果您喜欢缺少值,请使用map)

代码语言:javascript
复制
frame3['NewArea'] = frame3.area.replace(areas_to_fuse)

然后,您可以为值对应的每个区域创建第二个字典编码,并将其映射到列NewArea

代码语言:javascript
复制
newvalues = frame3.groupby('NewArea').numbercount.sum().to_dict()
frame3['TotalNumber'] = frame3.NewArea.map(newvalues)
frame3[['NewArea','TotalNumber']]

    NewArea     TotalNumber
0   area5       85
1   area5       85
2   area5       85
3   area5       85
4   area5       85
5   area6       25
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52184724

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档