повторная операция в пандах с Groupby и суммой - PullRequest
0 голосов
/ 05 сентября 2018

Я уже некоторое время пытаюсь разобраться со следующей проблемой. Надеюсь, кто-нибудь может мне помочь. Я пытаюсь суммировать количество счетов (например, число рождений) для разных областей. Как показано в таблице ниже, у меня есть набор данных, в котором, например, области 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 остается неизменной на протяжении многих лет. Данные слияния представлены в формате, аналогичном приведенному ниже, в рамке 2:

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

Результат, который я пытаюсь получить, - это общее число (TotalNumber) для вновь сформированных областей 5 (1 + 2 + 3 + 4 + 5 после слияния) и 6 (без изменений по годам), как показано в кадре 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

1 Ответ

0 голосов
/ 05 сентября 2018

Вы можете использовать словари для сопоставления существующих данных.

Сначала создайте словарь, который скажет вам для каждой области, в какой области он сливается:

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, используя replace на frame3['area'] (обратите внимание, что replace позволяет сохранить значения, отсутствующие в ключах словаря, если вы предпочитаете пропущенные значения, используйте 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...