首页 > 解决方案 > 在具有相同日期的行的数据框中求和并添加新列

问题描述

我的代码以这种方式开始:它从HERE获取数据,我想提取所有包含“fascia_anagrafica”等于“20-29”的行。在意大利语中,“fascia_anagrafica”的意思是“年龄范围”。这相对简单,如下所示,我删除了一些不重要的值。

import pandas as pd
import json
import numpy
import sympy
from numpy import arange,exp
from scipy.optimize import curve_fit
from matplotlib import pyplot
import math
import decimal

df = pd.read_csv('https://raw.githubusercontent.com/italia/covid19-opendata- 
vaccini/master/dati/somministrazioni-vaccini-latest.csv') 

df = df[df["fascia_anagrafica"] == "20-29"]

df01=df.drop(columns= ["fornitore","area","sesso_maschile","sesso_femminile","seconda_dose","pregressa_infezione","dose_aggiuntiva","codice_NUTS1","codice_NUTS2","codice_regione_ISTAT","nome_area"])

现在数据框看起来像这样:IMAGE

如您所见,对于每个日期,都有“20-29 年龄范围”,并且对于每一行,您可能会找到代表“first_dose”的值“prima_dose”。

现在的问题:如果您考虑日期“2020-12-27”,您会注意到它重复了大约 20 次(具有 20 个不同的值),因为在意大利有 21 个地区,那么这同样适用于其他日期. 不幸的是,他们并不总是 21,因为在某些地区,他们在某些日子里没有输入任何值,所以数据框不是周期性的。

我想在数据框中添加一列,该列对数据框中所有日期具有相同日期的值求和。这里有一个例子:

日期…………prima_dose…………sum_column

2020-8-9........ 1........................13 <----这个是(2020-8-9这一天的1+3+4+5)

2020-8-9........3........................8 <----这是(2020-8-10 当天的 2+5+1)

2020-8-9............. 4.......等等......

2020-8-9........ 5

2020-8-10........ 2

2020-8-10....... 5

2020-8-10....... 1

谢谢!

标签: pandasdataframesum

解决方案


如果您只想对每个日期的“prima_dose”的所有值求和并在新数据框中获取结果,您可以使用groupby.sum()

result = df01.groupby('data_somministrazione')['prima_dose'].sum().reset_index()

印刷:

>>>  result

    data_somministrazione  prima_dose
0              2020-12-27         700
1              2020-12-28         171
2              2020-12-29          87
3              2020-12-30         486
4              2020-12-31        2425
..                    ...         ...
289            2021-10-12       11583
290            2021-10-13       12532
291            2021-10-14       15347
292            2021-10-15       13689
293            2021-10-16        9293

[294 rows x 2 columns]

这将改变您当前数据框的结构,并在每个日期返回一个唯一的行


如果要在现有数据框中添加新列而不改变其结构,则应使用groupby.transform()

df01['prima_dose_per_date'] = df01.groupby('data_somministrazione')['prima_dose'].transform('sum')

印刷:

>>> df01

       data_somministrazione fascia_anagrafica  prima_dose  prima_dose_per_date
0                 2020-12-27             20-29           2                  700
7                 2020-12-27             20-29           9                  700
12                2020-12-27             20-29          60                  700
17                2020-12-27             20-29          59                  700
23                2020-12-27             20-29         139                  700
                     ...               ...         ...                  ...
138475            2021-10-16             20-29         533                 9293
138484            2021-10-16             20-29         112                 9293
138493            2021-10-16             20-29           0                 9293
138502            2021-10-16             20-29         529                 9293
138515            2021-10-16             20-29           0                 9293

[15595 rows x 4 columns]

这将保留数据框的当前结构并返回一个新列,其中包含每个日期的 prima_dose 总和。


推荐阅读