Python 根据groupby的结果对列进行排序

Python 根据groupby的结果对列进行排序,python,numpy,sorting,group-by,Python,Numpy,Sorting,Group By,我有一个这样的数据集 df = pd.DataFrame({'time':['13:30', '9:20', '18:12', '19:00', '11:20', '13:30', '15:20', '17:12', '16:00', '8:20'], 'item': ["coffee", "bread", "pizza", "rice", "soup", "

我有一个这样的数据集

df = pd.DataFrame({'time':['13:30', '9:20', '18:12', '19:00', '11:20', '13:30', '15:20', '17:12', '16:00', '8:20'],
               'item': ["coffee", "bread", "pizza", "rice", "soup", "coffee", "bread", "pizza", "rice", "soup"]})
这是我想要的输出

这是我的密码

#split the hour part from the time string
df['hour'] = df.Time.apply(lambda x: int(x.split(':')[0]))

def time_period(hour):
    if hour >= 6 and hour < 11:
        return 'breakfast'
    elif hour >= 11 and hour < 15:
        return 'lunch'
    else:
        return 'dinner'
df['meal'] = df['hour'].apply(lambda x: time_period(x))

a = df.groupby(['meal','Item']).size()
l = []
for i in np.sort(a.index.get_level_values(level=0).unique().tolist()):
    l.append(a.loc[i].reset_index().rename(columns = {0:'count'}))
b = pd.concat(l,axis=1)
c = [i for i in a.index.get_level_values(level=0).unique().tolist()*2]
c = np.sort(c)
b.columns = [c,b.columns]
display(b.head(10))
#从时间字符串中拆分小时部分
df['hour']=df.Time.apply(lambda x:int(x.split(':')[0]))
def时间段(小时):
如果小时>=6且小时<11:
返回“早餐”
elif小时>=11和小时<15:
返回“午餐”
其他:
返回“晚餐”
df['mean']=df['hour'].应用(λx:时间段(x))
a=df.groupby(['mean','Item']).size()
l=[]
对于np.sort(a.index.get_level_值(level=0.unique().tolist())中的i:
l、 追加(a.loc[i].reset_index().rename(列={0:'count'}))
b=pd.concat(l,轴=1)
c=[i代表a.index.get_level_值(level=0.unique().tolist()*2]
c=np.sort(c)
b、 列=[c,b.列]
显示器(b.头部(10))
我只想根据早餐数量对表格进行排序,但我不知道如何进行排序。

您可以使用并指定要排序的列:

将熊猫作为pd导入
将numpy作为np导入
df=pd.DataFrame(数据帧=
{'time':['13:30','9:20','18:12','19:00','11:20','13:30','15:20','17:12','16:00','8:20'],
“物品”:[“咖啡”、“面包”、“比萨饼”、“米饭”、“汤”、“咖啡”、“面包”、“比萨饼”、“米饭”、“汤”]
})
#从时间字符串中拆分小时部分
df['hour']=df.time.apply(lambda x:int(x.split(':')[0]))
def时间段(小时):
如果小时>=6且小时<11:
返回“早餐”
elif小时>=11和小时<15:
返回“午餐”
其他:
返回“晚餐”
df['mean']=df['hour'].应用(λx:时间段(x))
df['fine',item'].pivot_表(columns='fine',index='item',aggfunc=np.size)。排序_值(“早餐”,升序=True)
午餐早餐晚餐午餐
项目
面包2.0 2.0 NaN
汤2.0南2.0
咖啡楠楠4.0
披萨NaN 4.0 NaN
米楠4.0楠

实现所需功能的更好代码是:

df = pd.DataFrame({'time':['13:30', '9:20', '18:12', '19:00', '11:20', '13:30', 
                  '15:20', '17:12', '16:00', '8:20'],
                   'item': ["coffee", "bread", "pizza", "rice", "soup", "coffee", "bread", "pizza", "rice", "soup"]})

df['hour'] = df.time.apply(lambda x: int(x.split(':')[0]))
df['meal'] = np.where((df.hour >= 6) & (df.hour < 11), 'breakfast',
                 np.where((df.hour>=11) & (df.hour < 15), 'lunch', 'dinner')) 

df = df.groupby(['meal', 
     'item']).size().rename('count').to_frame().reset_index().pivot(columns=['meal'])
df.columns = df.columns.swaplevel(0,1)
df.sort_index(axis=1, level=0, inplace=True)
df.sort_values(by=('breakfast', 'count'), inplace=True)
df

           breakfast        dinner        lunch   
           count   item  count   item count    item
0          1.0  bread    NaN    NaN   NaN     NaN
1          1.0   soup    NaN    NaN   NaN     NaN
2          NaN    NaN    1.0  bread   NaN     NaN
3          NaN    NaN    2.0  pizza   NaN     NaN
4          NaN    NaN    2.0   rice   NaN     NaN
5          NaN    NaN    NaN    NaN   2.0  coffee
6          NaN    NaN    NaN    NaN   1.0    soup
df=pd.DataFrame({'time':['13:30','9:20','18:12','19:00','11:20','13:30',',
'15:20', '17:12', '16:00', '8:20'],
‘物品’:[“咖啡”、“面包”、“比萨饼”、“米饭”、“汤”、“咖啡”、“面包”、“比萨饼”、“米饭”、“汤”]]
df['hour']=df.time.apply(lambda x:int(x.split(':')[0]))
df[“膳食”]=np.其中((df.hour>=6)和(df.hour<11),“早餐”,
np.where((df.hour>=11)和(df.hour<15),“午餐”、“晚餐”)
df=df.groupby(['mean',
'item'].size().rename('count').to_frame().reset_index().pivot(columns=['mean'])
df.columns=df.columns.swaplevel(0,1)
排序索引(轴=1,级别=0,在位=True)
df.sort_值(by=('breaken','count'),inplace=True)
df
早餐晚餐午餐
计数项目计数项目计数项目计数项目
0 1.0面包楠楠楠
1 1.0汤楠楠楠
2楠楠1.0面包楠楠楠楠
3楠楠2.0比萨饼楠楠楠楠
4楠楠2.0米楠楠楠楠
5南2.0咖啡
6南1.0汤