2016-07-23 21 views
1

我想通過評估if-then-else塊中的多個條件在Pandas DataFrame中創建一個新列。評估熊貓數據框中的if-then-else塊中的多個條件

if events.hour <= 6: 
    events['time_slice'] = 'night' 
elif events.hour <= 12: 
    events['time_slice'] = 'morning' 
elif events.hour <= 18: 
    events['time_slice'] = 'afternoon' 
elif events.hour <= 23: 
    events['time_slice'] = 'evening' 

當我運行它,我得到的錯誤如下:

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

所以,我試圖通過添加任何聲明來解決這個像圖所示:

if (events.hour <= 6).any(): 
    events['time_slice'] = 'night' 
elif (events.hour <= 12).any(): 
    events['time_slice'] = 'morning' 
elif (events.hour <= 18).any(): 
    events['time_slice'] = 'afternoon' 
elif (events.hour <= 23).any(): 
    events['time_slice'] = 'evening' 

現在我做沒有得到任何錯誤,但是當我檢查time_slice的唯一值時,它只顯示'夜'

np.unique(events.time_slice) 

array(['night'], dtype=object)

我該如何解決這個問題,因爲我的數據包含應該得到'早上','下午'或'晚上'的樣本。謝謝!

回答

3

可以使用pd.cut()方法,以分類數據:

演示:

In [66]: events = pd.DataFrame(np.random.randint(0, 23, 10), columns=['hour']) 

In [67]: events 
Out[67]: 
    hour 
0  5 
1 17 
2 12 
3  2 
4 20 
5 22 
6 20 
7 11 
8 14 
9  8 

In [71]: events['time_slice'] = pd.cut(events.hour, bins=[-1, 6, 12, 18, 23], labels=['night','morning','afternoon','evening']) 

In [72]: events 
Out[72]: 
    hour time_slice 
0  5  night 
1 17 afternoon 
2 12 morning 
3  2  night 
4 20 evening 
5 22 evening 
6 20 evening 
7 11 morning 
8 14 afternoon 
9  8 morning 
+0

也許第一格是'-1',因爲如果該條目是'0',這可能使它喃? – Divakar

+0

@Divakar,趕上,謝謝!我已經更正了我的回答 – MaxU

2

您可以創建一個功能:

def time_slice(hour): 
    if hour <= 6: 
     return 'night' 
    elif hour <= 12: 
     return 'morning' 
    elif hour <= 18: 
     return 'afternoon' 
    elif hour <= 23: 
     return 'evening' 

然後events['time_slice'] = events.hour.apply(time_slice)應該做的伎倆。

2

這裏有一個NumPy的方法吧 -

tags = ['night','morning','afternoon','evening'] 
events['time_slice'] = np.take(tags,((events.hour.values-1)//6).clip(min=0)) 

採樣運行 -

In [130]: events 
Out[130]: 
    hour time_slice 
0  0  night 
1  8 morning 
2 16 afternoon 
3 20 evening 
4  2  night 
5 14 afternoon 
6  7 morning 
7 18 afternoon 
8  8 morning 
9 22 evening 
+1

'((events.hour.values-1)// 6).clip(min = 0)' - 這非常聰明 – MaxU

+1

@MaxU我想是這樣,但僅適用於定期間隔。 – Divakar