2016-10-31 6 views
1

ich einen Datenrahmen haben, die wie folgt aussieht:Count Instanzen anhand von Kriterien mit groupby()

In [60]: df1 
Out[60]: 
    DIFF UID 
0 NaN 1 
1 13.0 1 
2 4.0 1 
3 NaN 2 
4 3.0 2 
5 23.0 2 
6 NaN 3 
7 4.0 3 
8 29.0 3 
9 42.0 3 
10 NaN 4 
11 3.0 4 

und für jede UID möchte ich, wie viele Instanzen berechnen gefunden Wert für DIFF über einen bestimmten haben param.

Ich habe versucht, so etwas wie diese:

In [61]: threshold = 5 

In [62]: df1[df1.DIFF > threshold].groupby('UID')['DIFF'].count().reset_index().rename(columns={'DIFF':'ATTR_NAME'}) 
Out[63]: 
    UID ATTR_NAME 
0 1   1 
1 2   1 
2 3   2 

Das funktioniert gut, in Bezug jedoch die Rückkehr die richtige Anzahl der Instanzen pro Benutzer usw. zu finden, würde Ich mag Lage sein, auch die Benutzer gehören zu das haben 0 Instanzen, die jetzt im Teil ausgeschlossen sind.

würde die gewünschte Ausgabe sein:

UID ATTR_NAME 
0 1   1 
1 2   1 
2 3   2 
3 4   0 

Irgendwelche Ideen?

Dank

Antwort

1

Einfach, verwenden .reindex:

req = df1[df1.DIFF > threshold].groupby('UID')['DIFF'].count() 
req = req.reindex(df1.UID.unique()).reset_index().rename(columns={'DIFF':'ATTR_NAME'}) 

In einer Zeile:

df1[df1.DIFF > threshold].groupby('UID')['DIFF'].count().reindex(df1.UID.unique()).reset_index().rename(columns={'DIFF':'ATTR_NAME'}) 
+0

Danke für die Hilfe! Ich muss lernen, "Reindex" besser zu verwenden. – Thanos

0

Eine weitere Möglichkeit, eine Funktion mit apply() zu verwenden wäre, dies zu tun:

In [101]: def count_instances(x, threshold): 
    counter = 0 
    for i in x: 
     if i > threshold: counter += 1 
    return counter 
    .....: 

In [102]: df1.groupby('UID')['DIFF'].apply(lambda x: count_instances(x, 5)).reset_index() 
Out[102]: 
    UID DIFF 
0 1  1 
1 2  1 
2 3  2 
3 4  0 

Es scheint, dass auf diese Weise ein wenig schneller ist als gut:

In [103]: %timeit df1.groupby('UID')['DIFF'].apply(lambda x: count_instances(x, 5)).reset_index() 
100 loops, best of 3: 2.38 ms per loop 

In [104]: %timeit df1[df1.DIFF > 5].groupby('UID')['DIFF'].count().reset_index() 
100 loops, best of 3: 2.39 ms per loop 
0

wäre so etwas wie diese Arbeit gut für Sie?

enter image description here

+0

Das ist ein guter. Scheint ein bisschen langsamer als die beiden vorherigen Vorschläge. Danke für die Hilfe! 'In [109]:% time it df1.groupby ('UID') ['DIFF']. Agg ({'count': Lambda x: (x> 5) .sum()}). Reset_index() 100 Schleifen , Best of 3: 3.08 ms pro Schleife " – Thanos

+1

Versuchen Sie, Ihren Code zu kopieren und einzufügen, anstatt einen Screenshot zu verwenden. – Kartik

0

Suche die Anzahl der Werte Kriterien entsprechende zählen, ohne die Schlüssel Ausfiltern, die keine Übereinstimmungen haben, entspricht die Zahl der True Einstimmungen pro Gruppe zu zählen, die mit einem sum von Booleschen Werten durchgeführt werden kann:

(df1.DIFF > 5).groupby(df1.UID).sum().reset_index() 

    UID DIFF 
0 1 1.0 
1 2 1.0 
2 3 2.0 
3 4 0.0 
Verwandte Themen