使用groupby

时间:2016-07-26 15:26:04

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

我已经生成了一个表格,显示了我的数据集的模式值。 数据集最初按“日期”,“小时”和“房间”分组,以便能够获得步行交通的模式值。 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的room2的有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

要回答Conner的请求,请参阅下面的原始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  

如果有人知道如何通过每个组并且只保留最大模式值,如果有几个我会非常感激。

感谢您的时间!

-Romain

1 个答案:

答案 0 :(得分:1)

我在找这样的东西。仅供参考,您可以使用def str1="My application version is $app_version" def str2 = str1.replaceAll('$app_version','2016072601') println str2​

获取此信息
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']) meanmaxmedianmin不同,{{1}没有mad方法对象!

一旦你完成了这个

mode

您可以重置索引并重新组合以应用每组GroupBy

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