如何按按多列分组的字段总和对数据框进行排序

时间:2017-10-04 13:52:40

标签: pandas

我有数据框

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总和排序)。我怎么能这样做?

3 个答案:

答案 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);

这是结果:

Result chart

“逐步”数据构建如下:

# 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

然后你所要做的就是绘制堆积的条形图。