kateli1991

如何在Python中对两个数组求和?



我做了一个这样的数据帧:

import numpy as np
import pandas as pd 

occurrence = np.array([4, 5, 4, 0, 1, 4, 3])
year = np.array([1851,1852,1853,1854,1855,1856,1857])
disaster = {"occur":pd.Series(occur),"year":pd.Series(year)}
df =  pd.DataFrame(disaster)

现在我要做一个函数,这样当我给出两年的时候,它会给出这两年发生的次数的总和。如果我把18511852,它将显示出现的是9。在

我写了一个这样的函数,但它显示了错误:

^{pr2}$


已被浏览了6699次
6 日,19 小时 之前提问
3 个回答
fefe Tyson

如果您只想使用numpy方法,您可以执行类似的操作:

import numpy as np

occurrence= np.array([4, 5, 4, 0, 1, 4, 3])
year = np.array([1851,1852,1853,1854,1855,1856,1857])

year1, year2 = 1851, 1852
mask = (year == year1) | (year == year2)
print occurrence[mask].sum()

请注意,如果您想要这两年之间发生的所有事件的总和,您可以做如下操作:

^{2}$

对于pandas,同样的方法仍然有效,但是正如其他人所指出的那样,如果您只对这两年(而不是它们之间的间隔)感兴趣的话,使用isin方法构建布尔掩码有更有效的方法。在

评论 - 2020年7月29日 10:44
fefe Tyson

print(df.loc[df['year'].isin((1851,1852))]["occur"].sum())

或者:

^{2}$

对于日期范围,创建范围列表似乎比使用&更有效:

df.loc[df.year.isin(range(s1, s2+1))].occur.sum()
评论 - 2020年7月29日 10:44
fefe Tyson

您需要使用&而不是and。这意味着你的职能应该是:

def dist(s1, s2):
    return df.occur[(df.year >= s1) & (df.year <= s2)].sum()

然后你有:

^{2}$

1851 <= df.year和{}都创建一个布尔序列。Python and不能像我们所希望的那样处理这些对象——它实际上是在每个系列上调用bool,这会导致错误。另一方面,&将执行元素和,当两个序列都是True时返回{}。在

您还可能会发现isin()对于计算给定日期列表的值很有用。例如:

>>> df.occur[df.year.isin([1851, 1852])].sum()
9
评论 - 2020年7月29日 10:44

最新Python问答

推荐Python问答