[英]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)
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.year
和df.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.