2016-07-23 20 views
1

if-then-elseブロックで複数の条件を評価して、Pandas DataFrameに新しい列を作成したいとします。私はこれを実行すると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)

データに「朝」、「午後」または「夕方」になるサンプルが含まれているため、どうすれば解決できますか。ありがとう!

あなたのデータを分類するために pd.cut()方法を使用することができます

答えて

3

デモ:

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'であれば、それはそれを作る可能性があるため、 NaN? – 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

関連する問題