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

How to sum two arrays in Python?

我做了一个这样的 DataFrame:

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.

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

def dist(s1,s2):
    return (sum (year>=s1 and year< s2))

print dist(s1,s2)

如果您特别想要一个 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()

请注意,如果您想要这两年之间发生的所有事件的总和,您可以做更像这样的事情:

mask = (year >= year1) & (year <= year2)

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

In [21]: import numpy as np

In [22]: import pandas as pd

In [23]: occurrence= np.array([4, 5, 4, 0, 1, 4, 3])

In [24]: year = np.array([1851,1852,1853,1854,1855,1856,1857])

In [25]: my_func = lambda *l: sum([x[0] for x in zip(occurrence, year) if x[1] in l])

In [26]: my_func(1851, 1852)
Out[26]: 9

In [27]: 

您需要使用 & 而不是 and。这意味着您的函数应该是:

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

然后你有:

In [72]: dist(1851, 1852)
Out[72]: 9

1851 <= df.yeardf.year <= 1852 都创建了一个布尔系列。 Python and 不能像我们想要的那样处理这些对象——它本质上是在每个系列上调用 bool,这会导致错误。另一方面,& 将按元素执行并返回 True 当两个系列都是 True.

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

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

或者:

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

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

更有效
df.loc[df.year.isin(range(s1, s2+1))].occur.sum()