如何对 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)
现在我想做一个函数,当我给出两年时,它会给出这两年出现次数的总和。如果我输入 1851
和 1852
,它会告诉我出现的是 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.year
和 df.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()
我做了一个这样的 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)
现在我想做一个函数,当我给出两年时,它会给出这两年出现次数的总和。如果我输入 1851
和 1852
,它会告诉我出现的是 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.year
和 df.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()