簡體   English   中英

使用Groupby和sum在熊貓中重復操作

[英]repeated operation in pandas with Groupby and sum

我已經設法解決以下問題已有一段時間了。 希望有人可以幫助我。 我嘗試總結不同地區的人數(例如出生人數)。 如下表所示,我有一個數據集,例如,區域1和2在融合區域4中在一起。 Area3不受影響。

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,如下所示。

series1 = frame1.groupby(['FusedIntoArea'])['numbercount'].sum()
series1

問題是我想將此分組依據和求和運算擴展到幾年的幾個融合區域。 在第3幀中顯示了該區域的擴展融合數據。 Area1和Area2融合形成Area4(就像以前一樣),但是現在還有更多:在那之后的一年,Area4和Area3融合形成Area5,而Area6保持不變。 融合數據的格式類似於以下frame2中的格式:

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中。

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

我想要得到的結果是新形成的區域5(融合后的1 + 2 + 3 + 4 + 5)和6(在年份中保持不變)的總數number(TotalNumber),如第4幀所示。 任何幫助深表感謝。 我應該使用聯接還是合並操作? 提前致謝。

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

您可以使用字典來映射現有數據。

首先創建一個字典,告訴您在哪個區域進行融合的每個區域:

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'}

這個正在做,你可以創建NewArea通過使用列replaceframe3['area']注意replace許可證,以保持在dictionnary的鍵不存在的值,如果你喜歡缺失值,使用map

frame3['NewArea'] = frame3.area.replace(areas_to_fuse)

然后,您可以為值對應的每個區域創建第二個字典編碼,並將其映射到您的列NewArea

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM