繁体   English   中英

如何在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)
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()

如果你只是想要一个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方法构建布尔掩码有更有效的方法。

你需要使用&而不是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
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]: 

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM