2017-10-04 2 views
0

Ich habe DatenrahmenWie Datenrahmen durch Summe von Feldern durch mehrere Spalten

city  device sessions_count 
----------------------------- 
New York desktop 10 
New York mobile 9 
Chicago desktop 6 
Detroit desktop 16 
Detroit mobile 7 

Ich brauche gestapeltes Balkendiagramm zu bauen gruppiert sortieren, wo Bar Stadt darstellt und es nach Gerätetyp geteilt wird. Ich habe es geschafft es für den ersten Reihen auf diese Weise

city_device = df.groupby(['city', 'device'])['sessions_count'].agg([np.sum]); 
city_device.unstack().head(n=5).iplot(kind='bar', barmode='stack') 

Aber ich muss zeigen, nur am meisten besuchten Städte (sortiert nach Summe von sessions_count von jeder Stadt) nur zu machen. Wie kann ich das machen?

+0

Möchten Sie eine Aufteilung zwischen Mobil/Desktop für die meisten besuchten zählen oder nicht? –

+0

@StevenG Ja, ich muss diesen Split aber sortieren nach Summe von Handy und Desktop – cooperok

Antwort

1

ich glaube, Sie brauchen Spalte tmp zum Sortieren Helfer, für ersetzen NaN s mit 0 hinzufügen fill_value=0 Parameter unstack:

a = df.groupby(['city', 'device'])['sessions_count'].sum().unstack(fill_value=0) 
a = a.assign(tmp=a.sum(axis=1)).sort_values('tmp', ascending=False).drop('tmp', 1).head(5) 
print (a) 
device desktop mobile 
city      
New York  10  9 
Detroit  16  1 
Chicago   6  0 
+0

Hmm, stimmt etwas nicht mit den Daten? Detroit Mobile sollte 7 sein? –

+0

Der angegebene Dataframe hatte einen Fehler, es war Modile statt Mobile –

1

nur die für größere Menge tail() Wert ändern .:

grouped_all = df.groupby(['city']).sum() 
city = grouped_all.sort_values('sessions_count').tail(2).index 
grouped_split = df[df.city.isin(city)].groupby(['city', 'device']).sum() 

        sessions_count 
city  device     
Detroit desktop    16 
     mobile    7 
New York desktop    10 
     mobile    9 

Jetzt Plot

grouped_split.unstack(level=0).plot.bar(stacked=True) 
1

Der Ansatz, an den ich denken kann, ist die Verwendung eines pivot_table mit Rändern, um die Summen nach Stadt zu haben, wobei die Werte nach Gerät gehalten werden. Dann können Sie nach dem Rand sortieren, die Ränder löschen und dann den gestapelten Barplot plotten.

Hier ist der Code:

# Creates the DataFrame 
df = pd.DataFrame({ 
    'city':['New York', 'New York', 'Chicago', 'Detroit', 'Detroit'], 
    'device': ['desktop', 'mobile', 'desktop', 'desktop', 'mobile'], 
    'session_count': [10, 9, 6, 16, 7] 
}) 

# Creates a pivot table with margins named 'All' 
# Sorts by 'All' column 
# Drops the margins 
# Plots the stacked barplot 
df.pivot_table(columns='device', 
       index='city', 
       values='session_count', 
       aggfunc=sum, 
       margins=True).\ 
    sort_values(by='All', ascending=False).\ 
    drop('All').drop('All', axis=1).\ 
    plot.bar(stacked=True); 

Und hier ist das Ergebnis:

Result chart

Der 'Schritt für Schritt' Datenaufbau ist die folgende:

# Creates the DataFrame 
df = pd.DataFrame({ 
    'city':['New York', 'New York', 'Chicago', 'Detroit', 'Detroit'], 
    'device': ['desktop', 'mobile', 'desktop', 'desktop', 'mobile'], 
    'session_count': [10, 9, 6, 16, 7] 
}) 

print(df) 

#  city device session_count 
# 0 New York desktop    10 
# 1 New York mobile    9 
# 2 Chicago desktop    6 
# 3 Detroit desktop    16 
# 4 Detroit mobile    7 

print(df.pivot_table(columns='device', 
       index='city', 
       values='session_count', 
       aggfunc=sum, 
       margins=True)) 

# device desktop mobile All 
# city       
# Chicago  6.0  NaN 6.0 
# Detroit  16.0  7.0 23.0 
# New York  10.0  9.0 19.0 
# All   32.0 16.0 48.0 

print(df.pivot_table(columns='device', 
       index='city', 
       values='session_count', 
       aggfunc=sum, 
       margins=True).\ 
    sort_values(by='All', ascending=False)) 

# device desktop mobile All 
# city       
# All   32.0 16.0 48.0 
# Detroit  16.0  7.0 23.0 
# New York  10.0  9.0 19.0 
# Chicago  6.0  NaN 6.0 


print(df.pivot_table(columns='device', 
       index='city', 
       values='session_count', 
       aggfunc=sum, 
       margins=True).\ 
    sort_values(by='All', ascending=False).\ 
    drop('All').drop('All', axis=1)) 

# device desktop mobile 
# city      
# Detroit  16.0  7.0 
# New York  10.0  9.0 
# Chicago  6.0  NaN 

alle Dann Sie müssen den gestapelten Barplot zeichnen.

Verwandte Themen