2017-07-27 143 views
1

我想创建一个基于我的代码中显示的多个条件的新列。 我有一个字典jp_hol有在日本的假期和我的数据帧有一个字符串的日期列,并在功能 我使用的所有其他列但是我得到这个错误下面有人可以帮我找出问题基于多个条件创建熊猫数据框列

一个系列的真值是不明确的。使用a.empty,a.bool(),a.item(),a.any()或a.all()。

我的代码:

def flag(): 
    if (load['date'].isin([i for i in jp_hol.keys()]) |(load['day_of_week_int']==6)): 
     l='holiday' 
    elif load['day_of_week_int'].isin([i for i in range(0,5)]): 
     l='weekday' 
    elif load['day_of_week_int']==5: 
     l='sat' 
return l 
load['flag']=load.apply(flag(),axis=1 

注:如果假期落在平日则在假期应该优先于平日。

回答

1

所有面具创造TrueFalse系列,所以可以使用numpy.where

m1 = load['date'].isin([i for i in jp_hol.keys()]) | (load['day_of_week_int']==6) 
m2 = load['day_of_week_int'].isin([i for i in range(0,5)]) 
m3 = load['day_of_week_int']==5 


load['flag']=np.where(m1, 'holiday', 
      np.where(m2, 'weekday', 
      np.where(m3, 'sate', 'no match'))) 

样品:

load = pd.DataFrame({'A':list('abcdef'), 
        'B':[4,5,4,5,5,4], 
        'C':[7,8,9,4,2,3], 
        'D':[1,3,5,7,1,0], 
        'E':[5,3,6,9,2,4], 
        'F':list('aaabbb')}) 

print (load) 
m1 = load['B'] == 5 
m2 = load['C'] >5 
m3 = load['F'] == 'a' 

print (pd.concat([m1,m2,m3], axis=1)) 
     B  C  F 
0 False True True 
1 True True True 
2 False True True 
3 True False False 
4 True False False 
5 False False False 

load['flag']=np.where(m1, 'holiday', 
      np.where(m2, 'weekday', 
      np.where(m3, 'sate', 'no match'))) 

print (load) 
    A B C D E F  flag 
0 a 4 7 1 5 a weekday 
1 b 5 8 3 3 a holiday 
2 c 4 9 5 6 a weekday 
3 d 5 4 7 9 b holiday 
4 e 5 2 1 2 b holiday 
5 f 4 3 0 4 b no match 
+0

如果假期也是一个工作日,然后在假期应该优先考虑。我想知道你的代码是否可行? – user8183395

+0

没有数据是很难测试的,但在我看来可以有优先权。 'm1'中的''正确''m2'中的''真正',... – jezrael

+0

我添加了示例数据,它工作得非常好 - 它以优先级取代。 – jezrael

相关问题