2016-12-28 69 views
4

我從多個指標分析命名爲joined數據幀過濾我行:過濾行取決於多個條件,讓ValueError異常

joined[(joined.gvkey_x==gvkey) & (year-3<=joined.year_y<=year)] 

我想從所有滿足給定條件的數據框的行。 我返回此錯誤:

ValueError: The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all() 

我讀this answer其中規定,我應該使用.any()/ .all()但是這個心不是十分清楚。

有人可以向我解釋我應該如何應用多個條件,以及a.any() or a.all()在我的手術中的用途和用途(&)。

+1

你需要'(joined.year_y> =年3)(joined.year_y <=年)' – Psidom

+0

您能不能告訴我們的頭你的數據框? – Peaceful

回答

2

你可以使用query

joined.query('gvkey_x == @gvkey & @year - 3 <= year_y <= @year') 

演示

year = 2002 
gvkey = 12345 

joined = pd.DataFrame(dict(
     gvkey_x=[12343] * 6 + [12345] * 6 + [12346] * 6, 
     year_y=list(range(2000, 2006)) * 3 
    )) 
print(joined) 

    gvkey_x year_y 
0  12343 2000 
1  12343 2001 
2  12343 2002 
3  12343 2003 
4  12343 2004 
5  12343 2005 
6  12345 2000 
7  12345 2001 
8  12345 2002 
9  12345 2003 
10 12345 2004 
11 12345 2005 
12 12346 2000 
13 12346 2001 
14 12346 2002 
15 12346 2003 
16 12346 2004 
17 12346 2005 

print(joined.query('gvkey_x == @gvkey & @year - 3 <= year_y <= @year')) 

    gvkey_x year_y 
6 12345 2000 
7 12345 2001 
8 12345 2002 

原因你得到你的錯誤是因爲(year-3<=joined.year_y<=year)
pandas需要分別評估每個比較。

由於@Psidom提出的意見:

(joined.year_y >= year-3) & (joined.year_y <= year) 

會解決它。

1

您可以嘗試numpy.where(使用樣本數據):

>>> import pandas as pd 
>>> import numpy as np 
>>> df = pd.DataFrame({"year": [2013, 2014, 2014, 2015, 2013, 2013], "class": ['a', 'b', 'b', 'b', 'b', 'a'], "value": [13, 25, 32, 12, 23, 54]}) 
>>> df 
    class value year 
0  a  13 2013 
1  b  25 2014 
2  b  32 2014 
3  b  12 2015 
4  b  23 2013 
5  a  54 2013 
>>> df.ix[np.where((df['class'] == 'a') & (df['year'] == 2013))[0]] 
    class value year 
0  a  13 2013 
5  a  54 2013