Установить значение столбца данных на основе количества значений и сгруппировать по - PullRequest
0 голосов
/ 26 августа 2018

Проблема:

У меня есть базовый фрейм данных python / pandas с идентификатором устройства ("Sarzs_no") и столбцом, основанным на времени дня ("Time_of_day", два значения: день / ночь).

enter image description here

К сожалению, время суток однозначно в терминах одной единицы может содержать оба значения (день и ночь). Однако он должен содержать только один.

Мне бы хотелось иметь решение для изменения значений времени дня для каждой единицы на основе количества отсчетов, которые она имеет для дня и ночи. Если он имеет больше значений для дня, чем его следует установить в качестве дня для всех своих значений, и наоборот.

enter image description here

Я попытался составить формулу по этой проблеме:

def dayoftime(napszak_str):
    sarzs = row["Sarzs_no"]
    day = bfdataf[bfdataf["Sarzs_no"]==sarzs].groupby("Time_of_day").size()[0]
    night = bfdataf[bfdataf["Sarzs_no"]==sarzs].groupby("Time_of_day").size()[0]
    if day>=night:
        return "day"
    else:
        return "night"

... и затем назовите это:

bfdataf["new_tod"] = bfdataf["Time_of_day"].apply(dayoftime)

Но, к сожалению, я получаю ошибки "index out of bound".

Не могли бы вы помочь мне решить эту проблему?

Спасибо!

1 Ответ

0 голосов
/ 26 августа 2018

Вы можете получить количество для групп по GroupBy.size, создать DataFrame с join и последний столбец создания по numpy.where:

df = bfdataf.groupby(['Sarzs_no','Time_of_day']).size().unstack(fill_value=0)
df = bfdataf.join(df, on='Sarzs_no')

bfdataf['new_tod'] = np.where(df['day'] >= df['night'], 'day', 'night')

Другое решение - фильтровать столбцы и получать счетчики по sum для групп по transform:

days = (bfdataf['Time_of_day'] =='day').groupby(bfdataf['Sarzs_no']).transform('sum')
nights = (bfdataf['Time_of_day'] =='night').groupby(bfdataf['Sarzs_no']).transform('sum')

bfdataf['new_tod'] = np.where( days >= nights, 'day', 'night')

Другое решение, спасибо @Джон Клементс использует idxmax для помощника Series и создает новый столбец с помощью map:

s = bfdataf.groupby(['Sarzs_no','Time_of_day']).size().unstack(fill_value=0).idxmax(axis=1)
bfdataf['new_tod'] = bfdataf['Sarzs_no'].map(s)
print (bfdataf)
   Sarzs_no Time_of_day new_tod
0    101/16         day     day
1    101/16         day     day
2    101/16         day     day
3    101/16         day     day
4    101/16         day     day
5    101/16       night     day
6    101/16       night     day
7    101/16       night     day
8    101/17       night   night
9    101/17       night   night
10   101/17       night   night
11   101/17       night   night
12   101/17       night   night
13   101/17       night   night
14   101/17       night   night
15   101/17       night   night
16   101/17       night   night
17   101/17       night   night
18   101/17         day   night
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...