2016-03-22 8 views
4

Ich brauche die Gesamtzahl der negativen Werte in einem Datenrahmen. Ich bin in der Lage, für ein Array zu bekommen, aber nicht für DataFrame zu finden. Für Array, das ich unter Code verwende, kann mir jemand vorschlagen, wie man die Zählung für unten DataFrame erhält.Benötige Anzahl negativer Werte in einem Datenrahmen

sum(n<0 for n in numbers) 

Unten ist mein Datenrahmen und erwartete Ergebnis ist 4

a b c d 
    -3 -2 -1 1 
    -2 2 3 4 
    4 5 7 8 

Antwort

0

Ich bin für einen Array erhalten kann, aber nicht in der Lage für Datenrahmen finden

Es ist möglich, den Datenrahmen zu glätten Funktionen, die der Betrieb auf 1D-Arrays zu verwenden. Wenn Sie also mit, dass in Ordnung sind (wahrscheinlich als EdChum Antwort langsamer sein):

>>> import pandas as pd 
>>> df = pd.DataFrame({'a': [-3, -2, 4], 'b': [-2, 2, 5], 'c': [-1, 3, 7], 'd': [1, 4, 8]}) 
>>> df.values 
array([[-3, -2, -1, 1], 
     [-2, 2, 3, 4], 
     [ 4, 5, 7, 8]]) 
>>> df.values.flatten() 
array([-3, -2, -1, 1, -2, 2, 3, 4, 4, 5, 7, 8]) 
>>> sum(n < 0 for n in df.values.flatten()) 
4 
+0

Dies ist schneller für kleine dfs, aber es skaliert nicht gut für größere dfs, ich habe Timings in meine Antwort – EdChum

+0

enthalten Dank Ihrer Antwort hilft –

6

Sie .lt nennen können die df gegen einen skalaren Wert zu vergleichen und sum dann zweimal anrufen (das ist, weil es zuerst zeilenweise summiert

)
In [66]: 
df.lt(0).sum() 

Out[66]: 
a 2 
b 1 
c 1 
d 0 
dtype: int64 

Anruf sum wieder zusammenzufassen die Series:

In [58]: 
df.lt(0).sum().sum() 

Out[58]: 
4 

Sie können auch die Boolesche konvertieren df zu einem 1-D-Array und rufen np.sum:

In [62]: 
np.sum((df < 0).values.ravel()) 

Out[62]: 
4 

Timings

Für eine 30K Reihe df:

In [70]: 
%timeit sum(n < 0 for n in df.values.flatten()) 
%timeit df.lt(0).sum().sum() 
%timeit np.sum((df < 0).values.ravel()) 

1 loops, best of 3: 405 ms per loop 
100 loops, best of 3: 2.36 ms per loop 
1000 loops, best of 3: 770 µs per loop 

Die np-Methode gewinnt hier leicht ~ 525x schneller als die Loop-Methode und ~ 4x schneller als die reine Methode Pandas Methode

+0

Nice one, die Summe zweimal Sache – bakkal

+0

Dank dafür. Sehr schöne Lösung. –

Verwandte Themen