Pandas 熊猫如何有条件求和

Pandas 熊猫如何有条件求和,pandas,sum,conditional-statements,Pandas,Sum,Conditional Statements,我试图使用在不同数据帧上执行的计算结果填充数据帧。 当两个单独的系列满足条件时,这些计算应在一个系列上进行 这是我试过的。 我已经建立了一个数据框,rswcapacity,在这个数据框上应该运行计算,然后创建了另一个数据框annualcapacity,我希望在这里存储条件计算 #First DataFrame d = {'technology': ['EAF', 'EAF', 'EAF', 'BOF', 'BOF', 'BOF'], 'equip_detail1': [150, 130, 100

我试图使用在不同数据帧上执行的计算结果填充数据帧。 当两个单独的系列满足条件时,这些计算应在一个系列上进行

这是我试过的。 我已经建立了一个数据框,rswcapacity,在这个数据框上应该运行计算,然后创建了另一个数据框annualcapacity,我希望在这里存储条件计算

#First DataFrame
d = {'technology': ['EAF', 'EAF', 'EAF', 'BOF', 'BOF', 'BOF'], 'equip_detail1': [150, 130, 100, 200, 200, 150], 'equip_number' : [1, 2, 3, 1, 2, 3], 'capacity_actual': [2400, 2080, 1600, 3200, 3200, 2400], 'start_year': [1992, 1993, 1994, 1989, 1990, 1991], 'closure_year': [ '', 2002, '', '', 2001, 2011] }
rswcapacity = pd.DataFrame(data = d)
rswcapacity['closure_year'].replace('', np.nan, inplace = True)

#Second DataFrame    
annualcapacity = pd.DataFrame(columns=['years', 'capacity'])
annualcapacity ['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]

#Neither of the attempts below yields the desired results:
    for y in years:
        annualcapacity['capacity'].append(rswcapacity['capacity_actual'].apply(lambda x : x['capacity_actual'].sum() (x['start_year'] >= y & (x['closure_year'] <= y | x['closure_year'].isnull()))).sum())
    annualcapacity

#other attempt:
   for y in years:
         if (rswcapacity['start_year'] >= y).any() & ((rswcapacity['closure_year'].isnull()).any() | (rswcapacity['closure_year'] <= y).any()):
            annualcapacity['capacity'].append(rswcapacity['capacity_actual'].sum())
    annualcapacity
#第一个数据帧
d={'technology':[EAF'、'EAF'、'EAF'、'BOF'、'BOF'、'BOF'、'BOF'、'BOF'、'Equipment_detail1':[150130100200150]、'Equipment_number':[1,2,3,1,2,3]、'capacity(u actual':[2400208016000132002400、3200、2400、2400]、'start(年]:[1992、1993、1994、1989、1990、1991]、'closure)年]、[2002、'2001、2011])
rswcapacity=pd.DataFrame(data=d)
rswcapacity['closure_year'].替换('',np.nan,inplace=True)
#第二数据帧
annualcapacity=pd.DataFrame(列=[“年”,“容量])
年产能[‘年数’]=[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]
#以下两种尝试均未产生预期结果:
对于y年:

年产能['capacity'].append(rswcapacity['capacity_-actual'].apply(λx:x['capacity_-actual'].sum()(x['start_-year']>=y和(x['closure_-year']=y).any()('rswcapacity['closure_-year'].isnull()).any()(rswcapacity['closure_-year']您可以按以下方式执行此操作:

# 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
annualcapacity.loc[annualcapacity['capacity] == 0, 'capacity']= np.NaN
注意:总和始终是数字,因此,如果一年内没有容量,则值为0.0,而不是
NaN
。如果出于某种原因需要
NaN
,可以用下面的行替换。 第二点是我改变了你的状况

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

为此,您需要在页眉中添加
import numpy as np

为了更清晰,在您的codeHi@Valentina中加入条件切换是值得的。您所说的“条件切换”是什么意思?哦,我刚刚意识到我在代码中复制了旧版本的条件,你是说?我会更改它,谢谢。你好!就是这样!它让我对条件有了更深入的思考:-)
annualcapacity.loc[annualcapacity['capacity] == 0, 'capacity']= np.NaN