2017-02-28 2 views
0

Ich möchte eine Spalte Quantile für jedes Datum erstellen. Berechnete die Quantile für jeden eindeutigen Wert Sales-Wert. Ie Kategorie entspricht immer der gleichen Anzahl in den Verkäufen für jedes bestimmte Datum.Erstellen einer neuen Spalte in Pandas Quantil mit Quantile-Funktion

Ich habe Datenrahmen, der nach Datum indiziert ist. Es gibt viele Daten und mehrere gleiche Daten. Beispiel für die Teilmenge von df für 1 Tag:

  Category Sales Ratio 1 Ratio 2 
11/19/2016 Bar  300  0.46 0.96 
11/19/2016 Bar  300  0.56 0.78 
11/19/2016 Bar  300  0.43 0.96 
11/19/2016 Bar  300  0.47 0.94 
11/19/2016 Casino 550  0.92 0.12 
11/19/2016 Casino 550  0.43 0.74 
11/19/2016 Casino 550  0.98 0.65 
11/19/2016 Casino 550  0.76 0.67 
11/19/2016 Casino 550  0.79 0.80 
11/19/2016 Casino 550  0.90 0.91 
11/19/2016 Casino 550  0.89 0.31 
11/19/2016 Café 700  0.69 0.99 
11/19/2016 Café 700  0.07 0.18 
11/19/2016 Café 700  0.75 0.59 
11/19/2016 Café 700  0.07 0.64 
11/19/2016 Café 700  0.14 0.42 
11/19/2016 Café 700  0.30 0.67 
11/19/2016 Pub  250  0.64 0.09 
11/19/2016 Pub  250  0.93 0.37 
11/19/2016 Pub  250  0.69 0.42 

Ich mag einen Code, der eine neue Spalte fügt Quantilsgrenzen genannt, die für jeden berechnet datiert die 0,5 Quantil einzigartigen Sales. Wichtig zu beachten ist, dass Verkäufe für eine Kategorie für ein bestimmtes Datum immer gleich sind (die Dinge ändern sich, wenn sich die Daten ändern).

Beispiel für eine Lösung: df ['Quantil'] = df.Sales.groupby (df.index) .transform (Lambda x: x.quantile (q = 0.5, Achse = 0, Interpolation = 'Mittelpunkt'))

Allerdings würde dies nicht ausreichen (auch wenn es geklappt hat). Für dieses Beispiel (für dieses eine Datum), In der neuen Spalte df ['Quantile'] wären alle Werte für ein Datum mit Particular identisch.

Für dieses Datum würde die Berechnung 300, 550, 700 und 250 für das Quantil verwenden.

Deshalb ist die letzte df würde wie folgt aussehen:

 Category Sales Ratio 1 Ratio 2  Quantile 
11/19/2016 Bar  300  0.46 0.96  425 
11/19/2016 Bar  300  0.56 0.78  425 
11/19/2016 Bar  300  0.43 0.96  425 
11/19/2016 Bar  300  0.47 0.94  425 
11/19/2016 Casino 550  0.92 0.12  425 
11/19/2016 Casino 550  0.43 0.74  425 
11/19/2016 Casino 550  0.98 0.65  425 
11/19/2016 Casino 550  0.76 0.67  425 
11/19/2016 Casino 550  0.79 0.80  425 
11/19/2016 Casino 550  0.90 0.91  425 
11/19/2016 Casino 550  0.89 0.31  425 
11/19/2016 Café 700  0.69 0.99  425 
11/19/2016 Café 700  0.07 0.18  425 
11/19/2016 Café 700  0.75 0.59  425 
11/19/2016 Café 700  0.07 0.64  425 
11/19/2016 Café 700  0.14 0.42  425 
11/19/2016 Café 700  0.30 0.67  425 
11/19/2016 Pub  250  0.64 0.09  425 
11/19/2016 Pub  250  0.93 0.37  425 
11/19/2016 Pub  250  0.69 0.42  425 

Wenn ich, ohne auf nur ein Element jeder Kategorie Quantilsgrenzen aller Verkäufe für einen bestimmten Zeitpunkt zu tun, war ich so etwas wie 550 erhalten würde (was Ich möchte nicht).

Schlüssel Sache ist, ich möchte, dass der Code einfach und einigermaßen schnell (als Datum ist ziemlich groß). Auch die Interpolation muss Mittelpunkt sein.

Antwort

1

Es scheint, Sie brauchen drop_duplicates:

df['Quantile'] = df.Sales.groupby(df.index) 
        .transform(lambda x: x.drop_duplicates().quantile()) 
print (df) 
      Category Sales Ratio 1 Ratio 2 Quantile 
11/19/2016  Bar 300  0.46  0.96  425 
11/19/2016  Bar 300  0.56  0.78  425 
11/19/2016  Bar 300  0.43  0.96  425 
11/19/2016  Bar 300  0.47  0.94  425 
11/19/2016 Casino 550  0.92  0.12  425 
11/19/2016 Casino 550  0.43  0.74  425 
11/19/2016 Casino 550  0.98  0.65  425 
11/19/2016 Casino 550  0.76  0.67  425 
11/19/2016 Casino 550  0.79  0.80  425 
11/19/2016 Casino 550  0.90  0.91  425 
11/19/2016 Casino 550  0.89  0.31  425 
11/19/2016  Cafe 700  0.69  0.99  425 
11/19/2016  Cafe 700  0.07  0.18  425 
11/19/2016  Cafe 700  0.75  0.59  425 
11/19/2016  Cafe 700  0.07  0.64  425 
11/19/2016  Cafe 700  0.14  0.42  425 
11/19/2016  Cafe 700  0.30  0.67  425 
11/19/2016  Pub 250  0.64  0.09  425 
11/19/2016  Pub 250  0.93  0.37  425 
11/19/2016  Pub 250  0.69  0.42  425 

df['Quantile'] = df.Sales.groupby(df.index) 
        .transform(lambda x: np.percentile(x.unique(), 50)) 
print (df) 
      Category Sales Ratio 1 Ratio 2 Quantile 
11/19/2016  Bar 300  0.46  0.96  425 
11/19/2016  Bar 300  0.56  0.78  425 
11/19/2016  Bar 300  0.43  0.96  425 
11/19/2016  Bar 300  0.47  0.94  425 
11/19/2016 Casino 550  0.92  0.12  425 
11/19/2016 Casino 550  0.43  0.74  425 
11/19/2016 Casino 550  0.98  0.65  425 
11/19/2016 Casino 550  0.76  0.67  425 
11/19/2016 Casino 550  0.79  0.80  425 
11/19/2016 Casino 550  0.90  0.91  425 
11/19/2016 Casino 550  0.89  0.31  425 
11/19/2016  Cafe 700  0.69  0.99  425 
11/19/2016  Cafe 700  0.07  0.18  425 
11/19/2016  Cafe 700  0.75  0.59  425 
11/19/2016  Cafe 700  0.07  0.64  425 
11/19/2016  Cafe 700  0.14  0.42  425 
11/19/2016  Cafe 700  0.30  0.67  425 
11/19/2016  Pub 250  0.64  0.09  425 
11/19/2016  Pub 250  0.93  0.37  425 
11/19/2016  Pub 250  0.69  0.42  425 
+0

Gibt es eine Möglichkeit Argument hinzufügen, um nur für einen bestimmten Zeitpunkt Duplikate der Kategorie fallen? Wie könnte es Kategorien geben, die denselben Verkaufswert haben? Ie Quantil nur einen Verkaufswert für jede Kategorie für jedes Datum? – MysterioProgrammer91

+0

Können Sie Muster für Ihre Anforderungen ändern? Brauchen Sie 'filter first' wie' df1 = df [df.duplicated (subset = ['Kategorie', 'Sales']) & (df.index.isin (['11-19-2016', '11-20 -2016 ']))] 'und dann Quantil anwenden? – jezrael

+0

Fantastisches Danke – MysterioProgrammer91

Verwandte Themen