我有数据框
city device sessions_count
-----------------------------
New York desktop 10
New York mobile 9
Chicago desktop 6
Detroit desktop 16
Detroit mobile 7
我需要构建堆积条形图,其中bar表示城市,并且它由设备类型划分。我已经设法以这种方式只为第一行
city_device = df.groupby(['city', 'device'])['sessions_count'].agg([np.sum]);
city_device.unstack().head(n=5).iplot(kind='bar', barmode='stack')
但是我只需要显示大多数访问过的城市(按每个城市的sessions_count总和排序)。我怎么能这样做?
答案 0 :(得分:1)
我认为您需要帮助列tmp
进行排序,将NaN
0
添加fill_value=0
参数替换为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
答案 1 :(得分:1)
只需更改较大集的tail()
值。
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
现在的情节
grouped_split.unstack(level=0).plot.bar(stacked=True)
答案 2 :(得分:1)
我能想到的方法是使用带有边距的pivot_table
来按城市保存值按设备保存值。然后,您可以按边距排序,删除边距,然后绘制堆积的条形图。
以下是代码:
# 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);
这是结果:
“逐步”数据构建如下:
# 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
然后你所要做的就是绘制堆积的条形图。