2016-07-25 4 views
2

Я использую pandas, чтобы попытаться получить счет для членов, которые приобрели конкретный тип контракта между двумя датами. Dataframe, что я работаю с НАПОМИНАЕТ:Pandas Фильтрация по дате И ИЛИ Условие

Member Nbr  Contract-Type Date-Joined 
20   1 Year Membership  2011-08-01 
3128  3 Month Membership  2011-07-22 
3535  4 Month Membership  2015-02-18 
3760  4 Month Membership  2010-02-28 
3762  3 Month Membership  2010-01-31 
3882  1 Month Membership  2010-04-24  
3892  3 Month Membership  2010-03-24  
4116  3 Month Membership  2014-12-02 
4700  1 Month Membership  2014-11-11 
4802  4 Month Membership  2014-07-26 
5004   1 Year Membership  2012-03-12 
5020   1 Year Membership  2010-07-28  
5022  3 Month Membership  2010-06-25  
5130   1 Year Membership  2011-01-04 
         ... 

Я могу получить количество, если есть только один тип контракта, что я заинтересован в использовании

print(len(df[(df['Date-Joined'] > '2010-01-01') 
      & (df['Date-Joined'] < '2012-02-01') 
      & (df['Member Type'] == '1 Year Membership')])) 

Когда я пытаюсь что-то подобное указав 1 Year Membership или 4 Month Membership со следующим кодом

print(len(df[(df['Date-Joined'] > '2013-01-01') 
     & (df['Date-Joined'] < '2013-02-01') 
     & (df['Member Type'] == '1 Year Membership') 
     or (df['Member Type'] == '4 Month Membership')])) 

Я получаю следующую ошибку

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

и заменить условие or посредством & состояния возвращает 0

+5

Используйте '|' вместо 'or'. –

+1

Кроме того, '&' имеет приоритет над '' ', поэтому вашей логике, вероятно, понадобится еще один набор скобок. –

ответ

4

Использование | вместо or. Кроме того, & имеет приоритет над |, поэтому вашей логике требуется еще один набор круглых скобок.

import io 
import pandas as pd 

data = io.StringIO('''\ 
Member Nbr,Contract-Type,Date-Joined 
20,1 Year Membership,2011-08-01 
3128,3 Month Membership,2011-07-22 
3535,4 Month Membership,2015-02-18 
3760,4 Month Membership,2010-02-28 
3762,3 Month Membership,2010-01-31 
3882,1 Month Membership,2010-04-24 
3892,3 Month Membership,2010-03-24 
4116,3 Month Membership,2014-12-02 
4700,1 Month Membership,2014-11-11 
4802,4 Month Membership,2014-07-26 
5004,1 Year Membership,2012-03-12 
5020,1 Year Membership,2010-07-28 
5022,3 Month Membership,2010-06-25 
5130,1 Year Membership,2011-01-04 
''') 

df = pd.read_csv(data) 

print(df[ 
    (df['Date-Joined'] > '2010-01-01') & 
    (df['Date-Joined'] < '2012-02-01') & 
    (df['Contract-Type'] == '1 Year Membership') 
    ]) 

#  Member Nbr  Contract-Type Date-Joined 
# 0   20 1 Year Membership  2011-08-01 
# 11  5020 1 Year Membership  2010-07-28 
# 13  5130 1 Year Membership  2011-01-04 

print(df[ 
    (df['Date-Joined'] > '2010-01-01') & 
    (df['Date-Joined'] < '2012-02-01') & 
    (df['Contract-Type'] == '1 Year Membership') | 
    (df['Contract-Type'] == '4 Month Membership') 
    ]) 

#  Member Nbr  Contract-Type Date-Joined 
# 0   20 1 Year Membership  2011-08-01 
# 2   3535 4 Month Membership  2015-02-18 <====== BEWARE! 
# 3   3760 4 Month Membership  2010-02-28 
# 9   4802 4 Month Membership  2014-07-26 <====== BEWARE! 
# 11  5020 1 Year Membership  2010-07-28 
# 13  5130 1 Year Membership  2011-01-04 

print(df[ 
    (df['Date-Joined'] > '2010-01-01') & 
    (df['Date-Joined'] < '2012-02-01') & 
    ((df['Contract-Type'] == '1 Year Membership') | 
    (df['Contract-Type'] == '4 Month Membership')) 
    ]) 

#  Member Nbr  Contract-Type Date-Joined 
# 0   20 1 Year Membership  2011-08-01 
# 3   3760 4 Month Membership  2010-02-28 
# 11  5020 1 Year Membership  2010-07-28 
# 13  5130 1 Year Membership  2011-01-04