我在多个标准上从名为joined
的数据框中过滤我的行:
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()
在我的操作(&amp;)中的用途和用途。
答案 0 :(得分: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 :(得分: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