2016-07-26 1 views
1

Я создал таблицу, которая показывает значения режима моего набора данных. Набор данных изначально был сгруппирован по «дате», «часу» и «комнате», чтобы получить значение режима пешеходного движения. GroupBy проводили следующим образом:Получение максимального режима для каждой группы с помощью groupby

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

Затем я генерируется значение режима (ов) для «трафика» каждой группы следующим образом:

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

В результате у меня dataframe, который отображает соответствующие группы и показывает модальное значение для комнаты, в час и в день. Моя проблема заключается в том, что в некоторых случаях число модальных значений более чем один (как 2 или 3 значения имели одинаковое количество наблюдений)

Ток dataframe выглядит следующим образом:

      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 

As вы можете увидеть выше, для комнаты 2 в 12:00 6 января, есть 2 модальных значения (23 и 26).
Моя проблема заключается в том, что в идеале я бы сбросил наименьшее значение «режима» из каждой группы, где есть более одного наблюдения.

Я рассмотрел несколько подходов, но не могу заставить это функционировать. я думал, что следующий будет работать:

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

Я бы тогда удалить дубликаты, но это не влияет на dataframe ..

или

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 (dataframe под названием «ДФ»):

 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

Я искал что-то вроде этого.FYI вы можете получить это с 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']) 

It turns out, unlike mean , max , median , min and mad there is no mode method for GroupBy objects!

После того, как вы сделали это

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

Вы можете сбросить индекс и перегруппировать применять max в каждой группе:

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

спасибо за ваш ответ. Я попробовал код, который вы предложили, но я столкнулся с следующей ошибкой: «AttributeError: не удается получить доступ к атрибуту атрибута« объектов »объектов« SeriesGroupBy », попробуйте использовать метод« apply ». – RomainD

+0

@RomainD Можете ли вы предоставить образец своих данных в csv или json (что-то легко загружать)? Всего несколько строк. –

+0

Извините за задержку, теперь я добавил образец исходных данных. Как вы можете видеть, я удалил некоторые из менее необходимых функций в моем «dataframe» – RomainD