2016-06-25 7 views
0

Ich habe ein Dataframe 'TagData' und ich versuche, eine Spalte 'second_step' im Datenrahmen zu begrenzen (Schreiben des Ergebnisses in eine neue Spalte namens (sehr ursprünglich) 'dritten_schritt'). Die Daten wie folgt aussieht:Umgrenzen einer Spalte in einem Datenrahmen

second_step 
0  0.185185 
1  0.148148 
2  0.148148 
3   0 
4  0.185185 
5   0 
6   0 
7   0 
8  0.148148 
9  0.185185 
10   0 

die Zeile mit:

dayData["third_step"] = max(min(dayData["second_step"],2),-2) 

Jedoch habe ich eine Ausnahme erhalten:

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

Könnte jemand lassen Sie mich wissen, was das bedeutet Sie wie der Datentyp a Dataframe (Type <class 'pandas.core.frame.DataFrame'>), wie ich sehr verwirrt bin.

Dank

Antwort

2

Ich würde Sie empfehlen, dass vektorisiert Funktionen zu nutzen - es schneller im Vergleich zu apply() Ansatz werden soll:

df['third_tep'] = np.where(np.abs(df.second_step) > 2, np.sign(df.second_step) * 2, df.second_step) 

In [43]: df 
Out[43]: 
    second_step third_tep 
0  0.185185 0.185185 
1  0.148148 0.148148 
2  0.148148 0.148148 
3  6.000000 2.000000 
4  0.185185 0.185185 
5  0.000000 0.000000 
6  -5.000000 -2.000000 
7  0.000000 0.000000 
8  0.148148 0.148148 
9  0.185185 0.185185 
10  0.000000 0.000000 

Zeit gegen 1.1M Reihen DF:

In [44]: df = pd.concat([df] * 10**5, ignore_index=True) 

In [45]: df.shape 
Out[45]: (1100000, 2) 

In [47]: %timeit df.second_step.apply(bounded) 
1 loop, best of 3: 996 ms per loop 

In [48]: %timeit np.where(np.abs(df.second_step) > 2, np.sign(df.second_step) * 2, df.second_step) 
100 loops, best of 3: 16.4 ms per loop 

Fazit: vektorisiert appro ch war ca. 61-mal schneller ...

0

Sie apply verwenden können

bounded = lambda x: max(min(x, 2), -2) 
dayData["third_step"] = dayData.second_step.apply(bounded) 
0

gibt es eine Pandas Methode, dies zu tun, clip:

In [6]: 
df['third_step'] = df['second_step'].clip(-.1,.1) 
df 

Out[6]: 
    second_step third_step 
0  0.185185   0.1 
1  0.148148   0.1 
2  0.148148   0.1 
3  0.000000   0.0 
4  0.185185   0.1 
5  0.000000   0.0 
6  0.000000   0.0 
7  0.000000   0.0 
8  0.148148   0.1 
9  0.185185   0.1 
10  0.000000   0.0 

Timings

In [11]: 
%timeit np.where(np.abs(df.second_step) > 2, np.sign(df.second_step) * 2, df.second_step) 

10 loops, best of 3: 28.9 ms per loop 

In [12]:  
%timeit df['second_step'].clip(-.1,.1) 

10 loops, best of 3: 51.2 ms per loop 

Diese ist fast 2x langsamer als der reine Nump y-Methode, die nicht überraschend ist, wie Pandas-Methoden führen zusätzliche Dinge wie Typ und Grenzen überprüfen

Verwandte Themen