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
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
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
Viel flexibler (und weniger obskur). –
Dies ist ein allgemeines Idiom in Numpy-Code. +1 – heltonbiker
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
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
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. –
@JoeKington: Oh, danke! – unutbu
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)! :) –
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
Ich denke, das ist gut, das einzig schlechte ist, dass "np.max! = Np.maximum" das mnemonisch schlecht macht – maxymoo
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.
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
Vielleicht etwas wie 'df [' value '] = max ((df [' value '], 0)) ' – John