2013-06-12 2 views
19

Ich möchte negative Werte in einer Pandas DataFrame-Spalte durch Null ersetzen.Zurück Max von Null oder Wert für eine Pandas DataFrame-Spalte

Gibt es eine prägnantere Möglichkeit, diesen Ausdruck zu konstruieren?

df['value'][df['value'] < 0] = 0 
+1

Das sieht aus, wie Sie es in 'numpy' tun würden ... Ich bezweifle, dass es eine prägnantere Möglichkeit gibt, als es in 2 Aussagen zu brechen. – mgilson

+0

Vielleicht etwas wie 'df [' value '] = max ((df [' value '], 0)) ' – John

Antwort

13

Hier ist der übliche Weg, es zu tun, die zwar nicht unbedingt prägnanter, flexibler ist (indem Sie diese auf beliebige Spalten anwenden können)

In [39]: df = DataFrame(randn(5,1),columns=['value']) 

In [40]: df 
Out[40]: 
     value 
0 0.092232 
1 -0.472784 
2 -1.857964 
3 -0.014385 
4 0.301531 

In [41]: df.loc[df['value']<0,'value'] = 0 

In [42]: df 
Out[42]: 
     value 
0 0.092232 
1 0.000000 
2 0.000000 
3 0.000000 
4 0.301531 
+0

Viel flexibler (und weniger obskur). –

+0

Dies ist ein allgemeines Idiom in Numpy-Code. +1 – heltonbiker

+0

Obwohl in einigen Punkten die np.clip oder np.max Lösungen leichter zu lesen sind, denke ich, das ist die genaueste Antwort auf meine ursprüngliche Frage. – bjornarneson

13

Sie die clip method verwenden:

import pandas as pd 
import numpy as np 
df = pd.DataFrame({'value': np.arange(-5,5)}) 
df['value'] = df['value'].clip(0, None) 
print(df) 

ergibt

value 
0  0 
1  0 
2  0 
3  0 
4  0 
5  0 
6  1 
7  2 
8  3 
9  4 
+2

Nebenbei bemerkt, brauchen Sie nicht die 'np .inf' als zweites Argument. Die Standardeinstellung lautet Keine, was in diesem Fall äquivalent ist. Wenn Sie Bedenken hinsichtlich der Lesbarkeit haben und das zweite Argument nicht verwenden, können Sie stattdessen 'df.value.clip_lower (0)' verwenden. –

+0

@JoeKington: Oh, danke! – unutbu

+0

Für was es wert ist, nahm ich an, dass 'pandas.DataFrame.clip' auch wie 'numpy' verhielt. Ich habe erst vor ca. 5 Minuten gemerkt, dass das nicht der Fall war (und du hast das zweite Argument nicht gebraucht)! :) –

10

Eine andere Möglichkeit ist numpy.maximum(). Das ist meiner Meinung nach einfacher zu lesen.

import pandas as pd 
import numpy as np 
df['value'] = np.maximum(df['value'], 0) 

Und es ist auch 2-3x schneller.

In [21]: df = pd.DataFrame({'value': np.arange(-1000000,1000000)}) 
In [22]: %timeit df.loc[df['value']<0,'value'] = 0 
10 loops, best of 3: 27.3 ms per loop 

In [23]: df = pd.DataFrame({'value': np.arange(-1000000,1000000)}) 
In [24]: %timeit df['value'] = np.maximum(df['value'], 0) 
100 loops, best of 3: 9.42 ms per loop 
+0

Ich denke, das ist gut, das einzig schlechte ist, dass "np.max! = Np.maximum" das mnemonisch schlecht macht – maxymoo

0

Nehmen wir nur Werte, die größer als Null sind, und lassen diejenigen übrig, die als NaN negativ sind (arbeitet mit Frames nicht mit Serien), dann imputieren.

Verwandte Themen