2017-05-07 1 views
1

I bis Gruppe muß die Daten durch year, place und das Intervall von price (Schrittgröße beträgt 5). Für jede Gruppe möchte ich levelWie Abstände in das Gruppierungsergebnis hinzuzufügen

df = 
year place price level 
1994 AAA  90  1 
1993 BBB  89  1 
1994 AAA  91  2 
1998 AAA  92  3 
1990 BBB  80  0 
1994 AAA  90  1 
1990 BBB  81  0 
1991 BBB  92  1 

I Gruppendaten Median schätzen kann und die Medianwerte von level zu berechnen, aber ich weiß nicht, wie Intervalle von price hinzuzufügen:

grouped_df = df.groupby(["year","place"]).agg({'level':'median'}).reset_index() 

Die richtige grouped_df sollte wie folgt strukturiert sein (die Zahlen können unterschiedlich sein, es ist nur ein Beispiel für die Datenstruktur):

grouped_df = 

year place price_min price_max level 
1990 AAA  80   85   1 
... 

UPDATE:

Endergebnis sollte in etwa so sein. Also, im Grunde price_min und price_max sind untere und obere Grenze, respectivelly:

year_ place_ level_median price_min price_max 
0 1990 BBB    0 75  80 
1 1991 BBB    1 80  85 
2 1993 BBB    1 85  90 
3 1994 AAA    1 85  90 
4 1998 AAA    3 90  95 
+0

'df2 = df.groupby ([ "Jahr", "Ort"]) agg ({ 'Niveau' : 'Median', 'Preis': [np.min, np.max]}). reset_index() '? – Chuck

Antwort

2

Ich glaube, Sie brauchen aggregate + cut:

Aber wenn gleiche Ausgangs weitere Kategorien müssen - hinzufügen 5. Nicht ideal, aber Spalten wurde in int konvertiert und mit mask5 hinzugefügt und dann zu categorical zurück konvertieren.

bins = range(0, df['price'].max() + 5, 5) 
labels_low = range(0, df['price'].max(), 5) 

df2['price_min'] = pd.cut(df2['price_min'], bins=bins, labels=labels_low) 
df2['price_max'] = pd.cut(df2['price_max'], bins=bins, labels=labels_low).astype(int) 
mask = df2['price_min'] == df2['price_max'] 
df2['price_max'] = df2['price_max'].mask(mask, df2['price_max'] + 5).astype('category') 

print (df2) 
    year_ place_ level_median price_min price_max 
0 1990 BBB    0   75   80 
1 1991 BBB    1   90   95 
2 1993 BBB    1   85   90 
3 1994 AAA    1   85   90 
4 1998 AAA    3   90   95 

Lösung ohne categorical:

df2['price_min'] = pd.cut(df2['price_min'], bins=bins, labels=labels_low).astype(int) 
df2['price_max'] = pd.cut(df2['price_max'], bins=bins, labels=labels_low).astype(int) 
mask = df2['price_min'] == df2['price_max'] 
df2['price_max'] = df2['price_max'].mask(mask, df2['price_max'] + 5) 
print (df2) 
    year_ place_ level_median price_min price_max 
0 1990 BBB    0   75   80 
1 1991 BBB    1   90   95 
2 1993 BBB    1   85   90 
3 1994 AAA    1   85   90 
4 1998 AAA    3   90   95 
+0

Wahrscheinlich habe ich nicht gut erklärt, aber ich schrieb in meiner Frage, dass die Schrittgröße im Intervall 5 sein sollte. Also sollte es sein (80-85), (85-90), (90-95). Natürlich – Dinosaurius

+0

Danke, price_min und price_max sind die untere und obere Grenze jedes Intervalls, also ist das Endergebnis im Grunde sehr ähnlich zu diesem, aber nur price_min und price_max sollten Zahlen sein – Dinosaurius

+0

Ich versuche die Antwort zu bearbeiten, bitte nachsehen – jezrael

2

Ich denke, wenn Sie Preis gruppiert in einem Bereich von 5 wollte, würde ich pd.cut verwenden die Bereiche dann erstellen GROUPBY.

df.groupby(['year','place',pd.cut(df.price,[79,86,91,96,101],labels=['80-85','86-90','91-95','96-100'])]).agg({'price':['min','max'],'level':'median'}) 

Ausgang:

    price  level 
        min max median 
year place price     
1990 BBB 80-85 80 81  0 
1991 BBB 91-95 92 92  1 
1993 BBB 86-90 89 89  1 
1994 AAA 86-90 90 91  1 
1998 AAA 91-95 92 92  3 

Lassen Sie uns dies versuchen.

df2 = df.groupby(['year', 
        'place', 
        pd.cut(df.price,[i for i in range(np.min(df.price)-5,np.max(df.price)+5,5)])] 
       ).agg({'price':['min','max'],'level':'median'}) 
+0

Gibt es eine Möglichkeit, es zu automatisieren? In meinen realen Daten habe ich viele Intervalle. – Dinosaurius

+0

Minimaler und maximaler Erwartungswert? –

+0

Was meinst du?price_min ist die Untergrenze eines Intervalls und price_max ist die Obergrenze. Also, zwei Spalten im Zusammenhang mit dem Preis. – Dinosaurius

Verwandte Themen