在多个条件下从数据框中过滤行,获得ValueError

时间:2016-12-28 16:01:20

标签: python pandas

我在多个标准上从名为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;)中的用途和用途。

2 个答案:

答案 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