Не удается отсортировать во время поворота во время дневного отображения - PullRequest
0 голосов
/ 28 июня 2018

Я пытаюсь пометить время как это

df['day-hour'] = ('Day' + (df['hour'] // 24).add(1).astype(str) +
              ' - ' + (df['hour'] % 24).astype(str))

Итак, результат будет

customer_id  hour   day-hour
1              10   Day1 - 10
1             123   Day6 - 3
1             489   Day21 - 9
2             230   Day9 - 14

тогда я пытаюсь сгруппировать df.groupby(['customer_id','day-hour']).size().unstack(fill_value=0)

и результат

day-hour               Day1 - 10   Day6 - 3   Day21 - 9   Day9 - 14
customer_id
1                              1          1           1           0
2                              0          0           0           1

Результат, который я ожидал, отсортирован по фактическим дням, подобным этому

day-hour               Day1 - 10   Day6 - 3   Day9 - 14   Day21 - 9
customer_id
1                              1          1           0           1
2                              0          0           1           0

Какой код я должен изменить?

1 Ответ

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

Есть 2 возможных решения - добавить нули, как указано @Zero в комментариях:

df['day-hour'] = ('Day' + (df['hour'] // 24).add(1).astype(str).str.zfill(2) +
              ' - ' + (df['hour'] % 24).astype(str).str.zfill(2) )

Или отсортировано по пользовательской функции с 2 полями :

df = df[sorted(df.columns,key=lambda x: (int(x.split(' - ')[0][3:]), int(x.split(' - ')[1])))]

Лучше для чтения:

def f(x):
    a = x.split(' - ')
    return (int(a[0][3:]), int(a[1]))

df = df[sorted(df.columns, key=f)]
print (df)
   Day1 - 10  Day6 - 3  Day9 - 14  Day21 - 9
1          1         1          0          1
2          0         0          1          0
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...