如何在熊猫中有条件地求和

时间:2019-09-10 10:15:53

标签: pandas sum conditional-statements

我正在尝试使用对另一个DataFrame执行的计算结果填充一个DataFrame。 当两个单独的序列满足条件时,这些计算应按一个序列进行。

这是我尝试过的。 我已经建立了一个数据框,该数据框应在其上运行计算,然后创建另一个数据框年产能,以存储条件计算。

 $url = "https://{server}/rest/vcenter/services"
Invoke-RestMethod -Method 'Get' -Uri $url -Credential $Cred 

我想要获得的结果是每年执行的总和。 例如: 1985年应返回NaN,因为1985年小于起始年份中的任何年份,1992年应返回14880,因为1992年大于任何起始年份并且小于任何终止年份 2001应该返回7200,因为它大于所有start_year且大于所有close_years。 取而代之的是,我的所有三项尝试都只返回了整个年份的NaN。

我设置条件有问题,但是还没有解决。

任何见识都值得赞赏!

1 个答案:

答案 0 :(得分:1)

您可以执行以下操作:

# start with an empty dataframe for the summed capacity
# with int32 as type of the year and float32 as type for the capacity
annualcapacity = pd.DataFrame({'years': pd.Series(dtype='int32'), 'capacity': pd.Series(dtype='float32')})

# use your list of years
years=  [1980, 1981, 1982, 1983, 1984, 1985, 1986, 1987, 1988, 1989, 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018, 2019, 2020]

for y in years:
    # create a sum for each year
    indexer= (rswcapacity['start_year'] <= y) & ((rswcapacity['closure_year'].isnull()) | (rswcapacity['closure_year'] >= y))
    capa= rswcapacity.loc[indexer, 'capacity_actual'].sum()
    # and append it to the result frame
    annualcapacity= annualcapacity.append(dict(years=y, capacity=capa), ignore_index=True)

annualcapacity

结果如下:

    years  capacity
0    1980       0.0
1    1981       0.0
2    1982       0.0
3    1983       0.0
4    1984       0.0
5    1985       0.0
6    1986       0.0
7    1987       0.0
8    1988       0.0
9    1989    3200.0
10   1990    6400.0
11   1991    8800.0
12   1992   11200.0
13   1993   13280.0
14   1994   14880.0
15   1995   14880.0
16   1996   14880.0
17   1997   14880.0
18   1998   14880.0
19   1999   14880.0
20   2000   14880.0
21   2001   14880.0
22   2002   11680.0
23   2003    9600.0
24   2004    9600.0
25   2005    9600.0
26   2006    9600.0
27   2007    9600.0
28   2008    9600.0
29   2009    9600.0
30   2010    9600.0
31   2011    9600.0
32   2012    7200.0
33   2013    7200.0
34   2014    7200.0
35   2015    7200.0
36   2016    7200.0
37   2017    7200.0
38   2018    7200.0
39   2019    7200.0
40   2020    7200.0

注意:总和始终为数字,因此,如果一年没有容量,则该值为0.0,而不是NaN。如果出于某种原因需要NaN,可以将其替换为下面的行。 第二点是,我切换了您的条件,

(rswcapacity['start_year'] >= y) & ((rswcapacity['closure_year'].isnull()) | (rswcapacity['closure_year'] <= y))

所以>=变成了<=,因为我想,您想对当年的所有可用容量求和,对吧?

因此,如果根本没有可用的容量,则需要NaN条目而不是0.0条目,可以执行以下操作:

annualcapacity.loc[annualcapacity['capacity] == 0, 'capacity']= np.NaN

为此,您需要在标题中添加import numpy as np