2017-12-05 1 views
1

Ich versuche, meine Daten auf nur die Zeilen im unteren Dezil der Daten für ein bestimmtes Datum zu filtern. Daher muss ich zuerst das Datum gruppieren, um das Unteruniversum von Daten zu erhalten, und dann von dort das gleiche Unteruniversum auf nur jene Werte filtern, die in das untere Dezil fallen. Ich muss dann alle verschiedenen Daten zu einem großen Datenrahmen zusammenfassen.Pandas groupby auf einer Spalte und dann filtern basierend auf Quantil Wert einer anderen Spalte

Zum Beispiel möchte ich die folgende df nehmen:

df = pd.DataFrame([['2017-01-01', 1], ['2017-01-01', 5], ['2017-01-01', 10], ['2018-01-01', 5], ['2018-01-01', 10]], columns=['date', 'value']) 

und nur die Zeilen, in denen der Wert für dieses Datum in der unteren Dezil (unter 1,8 bzw. 5,5):

 date  value 
0 '2017-01-01'  1 
1 '2018-01-01'  5 

Ich kann eine Reihe der unteren Dezile mit df.groupby(['date'], 'value'].quantile(.1) bekommen, aber das würde dann erfordern, dass ich durch die gesamte DF durchlaufen und vergleichen Sie den Wert mit dem Quantil Wert in der Serie, die ich wegen Leistungsprobleme vermeiden möchte .

Antwort

1

So ähnlich?

df.groupby('date').value.apply(lambda x: x[x < x.quantile(.1)]).reset_index(1,drop = True).reset_index() 

    date  value 
0 2017-01-01  1 
1 2018-01-01  5 

Edit:

df.loc[df['value'] < df.groupby('date').value.transform(lambda x: x.quantile(.1))] 
+0

Damit ist die Funktionalität, sondern durch den Einsatz von .apply effektiv durch den Datenrahmen wird Looping, die Performance-Probleme in der Praxis führt. Ich hoffe, wenn möglich eine Lösung zu finden, die effizienter ist als ein Looping. – cstainbrook

+0

@cstainbrook, Messepunkt. Versuchen Sie den Schnitt, sein Testen besser auf dem Dummy-Datensatz, wäre es interessant, das Ergebnis auf größeren Satz zu sehen – Vaishali

+0

Ja, das sieht gut aus und ist etwa 50% schneller auf die größeren Daten, was eine nette Verbesserung ist. Danke für die Hilfe! – cstainbrook

Verwandte Themen