【问题标题】:Getting the maximum mode per group using groupby使用 groupby 获取每组的最大模式
【发布时间】:2016-11-30 08:19:06
【问题描述】:

我生成了一个表格,其中显示了我的数据集的众数值。 数据集最初按“日期”、“小时”和“房间”分组,以便能够获得人流量的众数值。 groupby的执行如下:

dataframe = df.groupby([df['date'], df['hour'], df['room']])

然后我通过以下方式为每个组的“流量”生成模式值:

dataframe = dataframe['traffic'].apply(lambda x: x.mode())

因此,我的数据框显示了正确的组,并显示了每个房间、每小时和每天的模态值。 我的问题是,在某些情况下,模态值的数量不止一个(因为 2 或 3 个值具有相同数量的观察值)

当前数据框如下所示:

                            mode
date    hour    room        
6       12      room1   0   15  
                room2   0   23   
                        1   26  
                room3   0   1  
                        1   2
        13      room2   0   9
                        1   11
                room2   0   15

如上所示,对于 1 月 6 日 12:00 的房间 2,有 2 个模态值(23 和 26)。
我的问题是,理想情况下,我会从有超过 1 个观察值的每个组中删除最低的“模式”值。

我已经研究了几种方法,但无法使其发挥作用。 我在想以下方法会起作用:

dataframe.apply(lambda x: x[dataframe['mode'] == dataframe['mode'].max()])

然后我会删除重复项,但这不会影响数据框..

dataframe.filter(lambda x : x[dataframe['mode'] == dataframe['mode'].max()], dataframe['mode'])

这给了我一个“'函数'对象不可迭代”错误

for elem in range(0, dataframe.size -1):      #to iterate over the daaframe rows
    if elem != dataframe['mode'].max():       #to identify rows that aren't max mode value
        dataframe = dataframe.drop([elem])    #to drop these rows

要回答康纳的请求,请参阅下面的原始 csv 数据(名为“df”的数据框):

        room    time                 capacity   areaName    hour    date    traffic 
    0   room1   Mon Nov 02 09:00:00  40         area01      9       2       14
    1   room1   Mon Nov 02 09:05:00  40         area01      9       2       15
    2   room1   Mon Nov 02 09:10:00  80         area01      9       2       23  
    3   room1   Mon Nov 02 09:15:00  80         area01      9       2       23  
...
    14  room2   Mon Nov 02 11:00:00  40         area03      11      2       67  
    15  room2   Mon Nov 02 11:50:00  80         area03      11      2       64
    16  room2   Mon Nov 02 11:10:00  40         area03      11      2       72  

如果有人知道通过每个组的方法,并且只有在有多个组时才保持最大模式值,我将不胜感激。

感谢您的宝贵时间!

-罗曼

【问题讨论】:

    标签: python python-3.x pandas dataframe lambda


    【解决方案1】:

    我一直在寻找这样的东西。仅供参考,您可以通过df.head(n=10).to_csv(path, index=False) 获得此信息

    room,time,capacity,areaName,hour,date,traffic 
    room1,Mon Nov 02 09:00:00,40,area01,9,2,14
    room1,Mon Nov 02 09:05:00,40,area01,9,2,15
    room1,Mon Nov 02 09:10:00,80,area01,9,2,23  
    room1,Mon Nov 02 09:15:00,80,area01,9,2,23  
    room2,Mon Nov 02 11:00:00,40,area03,11,2,67  
    room2,Mon Nov 02 11:50:00,80,area03,11,2,64
    room2,Mon Nov 02 11:10:00,40,area03,11,2,72 
    

    (下面我使用等效代码更简洁)

    这会给你一个groupby 对象

    df = df.groupby(['date', 'hour', 'room'])
    

    事实证明,与meanmaxmedianminmad不同,GroupBy 对象没有 mode 方法!

    完成此操作后

    df = dataframe['traffic'].apply(lambda x: x.mode())
    

    您可以重置索引并重新组合以对每个组应用 max

    df = df.reset_index()
    df = df.groupby(['date', 'hour', 'room']).max()
    

    【讨论】:

    • 感谢您的回复。我尝试了您建议的代码,但遇到以下错误:“AttributeError:无法访问'SeriesGroupBy'对象的可调用属性'mode',请尝试使用'apply'方法”
    • @RomainD 您能否提供 csv 或 json 格式的数据样本(易于加载)?只需几行即可。
    • 抱歉耽搁了,我现在添加了原始数据的样本。如您所见,我在“数据框”中删除了一些不太需要的功能
    • PS 抱歉 @conner.xyz ,刚刚意识到我编辑了你的答案而不是我原来的问题
    • 在分组数据帧上使用 .max() 给我错误:“TypeError: unorderable types: str()
    猜你喜欢
    • 2016-02-16
    • 1970-01-01
    • 2018-12-31
    相关资源
    最近更新 更多