2017-10-24 1 views
0

Ich versuche, Quantile basierend auf Spalte J1 innerhalb jeder ID-Gruppe in den folgenden Datenrahmen hinzuzufügen.Zuweisen von Quantilen in Pandas Gruppen

import pandas as pd 
try_df = pd.DataFrame({'ID':['1','1','1','1','1','2','2','2','2','2','3','3','3','3','3'], 'J1': range(15)}) 
print(try_df)  
try_df["quantiles"] = try_df.groupby("ID")["J1"].transform(pd.qcut,4,["Q1","Q2","Q3","Q4"]) 

    ID J1 
0 1 0 
1 1 1 
2 1 2 
3 1 3 
4 1 4 
5 2 5 
6 2 6 
7 2 7 
8 2 8 
9 2 9 
10 3 10 
11 3 11 
12 3 12 
13 3 13 
14 3 14 

Der obige Code ergibt einen Wert Fehler: invalid literal for long() with base 10: 'Q4'

In den realen Daten, die es diesen Fehler führt:

ValueError: could not convert string to float: Q2 

Vorschläge, wie es zu lösen?

Antwort

0

Versuchen groupby + apply:

try_df.groupby("ID")["J1"].apply(lambda x: pd.qcut(x, 4, ["Q1","Q2","Q3","Q4"])) 

0  Q1 
1  Q1 
2  Q2 
3  Q3 
4  Q4 
5  Q1 
6  Q1 
7  Q2 
8  Q3 
9  Q4 
10 Q1 
11 Q1 
12 Q2 
13 Q3 
14 Q4 
Name: J1, dtype: category 
Categories (4, object): [Q1 < Q2 < Q3 < Q4] 
+0

Vielen Dank für Die schnelle Antwort, es funktionierte gut auf die gegebenen Daten, wenn ich das gleiche mache bei realen Daten gibt es einen ValueError: Bin Kanten müssen eindeutig sein: Array ([Nan, Nan, Nan, Nan, Nan, Nan, Nan]). Ich habe einen leeren Wert in den Daten. Irgendeine Idee, was der mögliche Grund sein könnte? Ich habe versucht, es durch eine Nummer zu ersetzen. – Apoorv

+0

@Apoorv Ich kann den Grund für Ihren Fehler angesichts dieser Informationen nicht lokalisieren, aber werfen Sie einen Blick auf https://stackoverflow.com/questions/36880490/why-use-pandas-qcut-return-valueerror-bin-edges-must- be-unique was helfen könnte. –

+0

Danke für den Link! Ich habe diesen Leerwert entfernt und es hat gut funktioniert. Ich denke, Wert ist irgendwie fehlerhaft und wird nicht behandelt. – Apoorv

0

Für mich Ihren Code sehr schön in Pandas arbeiten 0.20.3:

try_df["quantiles"] = try_df.groupby("ID")["J1"].transform(pd.qcut,4,["Q1","Q2","Q3","Q4"]) 
print (try_df) 
    ID J1 quantiles 
0 1 0  Q1 
1 1 1  Q1 
2 1 2  Q2 
3 1 3  Q3 
4 1 4  Q4 
5 2 5  Q1 
6 2 6  Q1 
7 2 7  Q2 
8 2 8  Q3 
9 2 9  Q4 
10 3 10  Q1 
11 3 11  Q1 
12 3 12  Q2 
13 3 13  Q3 
14 3 14  Q4 

Eine andere Lösung ist eine Funktion mit Lambda definieren:

try_df["quantiles"] = (try_df.groupby("ID")["J1"] 
          .transform(lambda x: pd.qcut(x,4,["Q1","Q2","Q3","Q4"]))) 
print (try_df) 
    ID J1 quantiles 
0 1 0  Q1 
1 1 1  Q1 
2 1 2  Q2 
3 1 3  Q3 
4 1 4  Q4 
5 2 5  Q1 
6 2 6  Q1 
7 2 7  Q2 
8 2 8  Q3 
9 2 9  Q4 
10 3 10  Q1 
11 3 11  Q1 
12 3 12  Q2 
13 3 13  Q3 
14 3 14  Q4