2016-07-23 11 views
1

Ich möchte eine neue Spalte in einem Pandas DataFrame erstellen, indem ich mehrere Bedingungen in einem if-then-else-Block auswerte.Mehrere Bedingungen in if-then-else-Block in einem Pandas DataFrame auswerten

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' 

Als ich das laufen lasse, erhalte ich den Fehler unten:

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

Also habe ich versucht, dieses Problem zu lösen, indem Sie die eine Aussage wie unten dargestellt:

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' 

Jetzt ich tun kein Fehler, aber wenn ich die eindeutigen Werte von time_slice überprüfe, zeigt es nur 'Nacht' an

np.unique(events.time_slice) 

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

Wie kann ich das lösen, weil meine Daten Samples enthalten, die 'Morgen', 'Nachmittag' oder 'Abend' erhalten sollen. Vielen Dank!

Antwort

3

Sie pd.cut() Methode verwenden können, um Ihre Daten zu kategorisieren:

Demo:

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

Vielleicht ist die erste ist würde 'sein -1', weil, wenn der Eintrag '0' ist, könnte es machen NaN? – Divakar

+0

@Divakar, guten Fang, danke! Ich habe meine Antwort korrigiert – MaxU

2

Sie eine Funktion erstellen können:

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

dann sollte events['time_slice'] = events.hour.apply(time_slice) den Trick.

2

Hier ist ein NumPy Ansatz, um es -

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

Probelauf -

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)' - das ist ziemlich schlau – MaxU

+1

@MaxU Ich denke schon, aber funktioniert nur für regelmäßige Intervalle. – Divakar