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?提供的数据帧中有错误,它是可修改的,而不是移动的