Pandas 如何按多列分组的字段总和对数据帧进行排序
我有数据帧Pandas 如何按多列分组的字段总和对数据帧进行排序,pandas,Pandas,我有数据帧 city device sessions_count ----------------------------- New York desktop 10 New York mobile 9 Chicago desktop 6 Detroit desktop 16 Detroit mobile 7 我需要建立堆叠条形图,其中条形图代表城市,并按设备类型划分。我已经设法做到了只有第一排这样 city_device = df.group
city device sessions_count
-----------------------------
New York desktop 10
New York mobile 9
Chicago desktop 6
Detroit desktop 16
Detroit mobile 7
我需要建立堆叠条形图,其中条形图代表城市,并按设备类型划分。我已经设法做到了只有第一排这样
city_device = df.groupby(['city', 'device'])['sessions_count'].agg([np.sum]);
city_device.unstack().head(n=5).iplot(kind='bar', barmode='stack')
但我只需要显示访问量最大的城市,按每个城市的会议总数排序。我该怎么做呢?我想您需要帮助器列tmp进行排序,用0替换NAN将fill_value=0参数添加到:
我认为您需要帮助器列tmp进行排序,将NAN替换为0将fill_value=0参数添加到: 只需更改较大集合的尾部值:
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)
只需更改较大集合的尾部值:
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)
我可以考虑的方法是使用一个带边距的pivot_表,按城市列出总数,并按设备保留值。然后可以按边距排序,删除边距,然后绘制堆叠条形图 代码如下:
# 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
然后,您所要做的就是绘制堆叠的条形图。我可以考虑的方法是使用一个带边距的pivot_表,以城市为单位获得总计,并按设备保留值。然后可以按边距排序,删除边距,然后绘制堆叠条形图 代码如下:
# 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
然后,您所要做的就是绘制堆叠条形图。您是否希望在手机/桌面之间拆分最大访问量计数?@StevenG是的,我需要保留拆分,但按手机和桌面的总和排序您是否希望在手机/桌面之间拆分最大访问量计数?@StevenG是的,我需要保留拆分,但按总和排序关于移动和桌面嗯,数据有问题吗?底特律移动应为7?提供的数据帧中有错误,它是可修改的,而不是mobileHmm,数据有问题吗?底特律移动应为7?提供的数据帧中有错误,它是可修改的,而不是移动的