Как добавить отсутствующие данные столбца с 0 отсчетами на Pandas DataFrame? - PullRequest
0 голосов
/ 03 июня 2018

У меня есть Pandas DataFrame, который выглядит следующим образом:

my frame

Вот проблема с набором данных: если был счетчик 0, тострока никогда не создавалась в предоставленном мне файле csv.Так, например, на неделе 6 есть только 2 записи (считается только 2 часа).Я хочу, чтобы на 6 неделе было 168 записей (поскольку на 1 неделе 168 часов), где 166 записей будут иметь 0 отсчетов.Таким образом, должны быть строки, такие как:

[год = 2018, неделя = 6, день недели = 1, час дня = 1, счетчик = 0, unit_id = бла, unit_label = бла]

[год = 2018, неделя = 6, день недели = 1, час дня = 2, число = 0, unit_id = бла, unit_label = бла]

...

[год = 2018, неделя = 6, день недели = 1, час дня = 23, количество = 1, unit_id = бла, unit_label = бла]

...

и т. д.и так далее.Оглядываясь вокруг, я догадываюсь, что мне нужно каким-то образом использовать "переиндексацию".Но я не могу просто напрямую использовать диапазоны дат, учитывая тот факт, что я хочу, чтобы эти очень специфические столбцы .Любой совет приветствуется.

Данные в виде текста:

{'count': {0: 5, 1: 1, 2: 1, 3: 8, 4: 1},'day_of_week': {0: 4, 1: 5, 2: 4, 3: 3, 4: 3},'hour_of_day': {0: 23, 1: 0, 2: 18, 3: 19, 4: 21},'unit_id': {0: 'bc9b8ac4-3c57-4fe1-9085-0e3d0b6233d6',1: 'bc9b8ac4-3c57-4fe1-9085-0e3d0b6233d6',2: '7a1efb1d-d4c1-47e1-9320-ff5707eae91e',3: '7a1efb1d-d4c1-47e1-9320-ff5707eae91e',4: '7a1efb1d-d4c1-47e1-9320-ff5707eae91e'},'unit_label': {0: '_debug TestPA',1: '_debug TestPA',2: '_TEMPORARILY_DISABLED_Jenn`s Favorite Destinations',3: '_TEMPORARILY_DISABLED_Jenn`s Favorite Destinations',4: '_TEMPORARILY_DISABLED_Jenn`s Favorite Destinations'},'week': {0: 29, 1: 29, 2: 46, 3: 51, 4: 51},'year': {0: 2017, 1: 2017, 2: 2015, 3: 2015, 4: 2015}}

1 Ответ

0 голосов
/ 03 июня 2018

Я считаю, что это должно сработать для вас.Он создаст кадр данных с одной строкой для каждого часа от минимальной даты до максимальной (очень большой!), И у вас будет запись для каждого часа с count, установленным на 0

# Start by creating a datetime column in your dataframe:
df['datetime'] = pd.to_datetime(df[['year', 'week', 'day_of_week', 'hour_of_day']]
               .apply(lambda x: '-'.join(x.astype('str')),
                      axis=1), format='%Y-%W-%w-%H')

#use reindex, to reindex hourly
new_df = (df.set_index('datetime')
          .reindex(pd.date_range(min(df.datetime), max(df.datetime), freq='H')))

# Go through and fill all your date and time column as necessary
new_df['week'] = new_df.index.week - 1
new_df['day_of_week'] = new_df.index.dayofweek + 1
new_df['year'] = new_df.index.year
new_df['hour_of_day'] = new_df.index.hour

# next, fill NaN in count with 0, and forward fill in unit id and unit label
new_df['count'].fillna(0, inplace=True)
new_df[['unit_id', 'unit_label']] = new_df[['unit_id', 'unit_label']].fillna(method='ffill')

Затем вы можете избавиться от индекса datetime, если хотите:

new_df.reset_index(drop=True, inplace=True)

>>> new_df.head()
   count  day_of_week  hour_of_day                               unit_id  \
0    1.0            4           18  7a1efb1d-d4c1-47e1-9320-ff5707eae91e   
1    0.0            4           19  7a1efb1d-d4c1-47e1-9320-ff5707eae91e   
2    0.0            4           20  7a1efb1d-d4c1-47e1-9320-ff5707eae91e   
3    0.0            4           21  7a1efb1d-d4c1-47e1-9320-ff5707eae91e   
4    0.0            4           22  7a1efb1d-d4c1-47e1-9320-ff5707eae91e   

                                          unit_label  week  year  
0  _TEMPORARILY_DISABLED_Jenn`s Favorite Destinat...    46  2015  
1  _TEMPORARILY_DISABLED_Jenn`s Favorite Destinat...    46  2015  
2  _TEMPORARILY_DISABLED_Jenn`s Favorite Destinat...    46  2015  
3  _TEMPORARILY_DISABLED_Jenn`s Favorite Destinat...    46  2015  
4  _TEMPORARILY_DISABLED_Jenn`s Favorite Destinat...    46  2015  
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...