Pandas иерархический свод получить столбец с макс - PullRequest
0 голосов
/ 22 мая 2018

df.head (). Info ()

RangeIndex: 5 entries, 0 to 4
Data columns (total 4 columns):
id    5 non-null object
date-hr               5 non-null object
channel           5 non-null object
hr                5 non-null int64
dtypes: int64(1), object(3)

Фактический date-hr выглядит примерно так:

'2017-02-14--15' 

id это строка

У меня есть df вроде:

User-ID | Date-hr | Channel | Hr

U1       D1-10      C1        10
U1       D1-11      C2        11
U1       D1-10      C1        10
U1       D1-10      C3        10
U1       D1-10      C1        10
U1       D1-11      C3        11
U1       D1-11      C2        11

..

, когда я применяю сводную операцию с идентификатором пользователя в качестве индекса и столбцами как

['date-hr', 'channel']

с использованием count в качестве функции агрегирования.

Я получаю 1 строку для каждого пользователя с первичным индексом в качестве даты-часа и всех каналов под этим одним значением даты-часа, например:

    D1-10     D1-11 .....

    C1  C3    C2 C3 .....

U1  3    1    2   1 .....

Теперь мне нужен максимальный канал для каждого 'date-hr' с числом

    D1-10   D1-11 .....

    C1      C2    .....

U1  (C1,3)  (C2,2) .....

. Я не могу понять, как получить это преобразование из моих данных.

1 Ответ

0 голосов
/ 22 мая 2018

Вы можете создать пользовательскую функцию:

print (df)
  User-ID Date-hr Channel  Hr
0      U1   D1-10      C1  10
1      U1   D1-11      C2  11
2      U1   D1-10      C1  10
3      U1   D1-10      C3  10
4      U2   D1-10      C1  10
5      U2   D1-11      C3  11
6      U2   D1-11      C2  11
6      U4   D7-11      C2  11

df = df.groupby(['User-ID','Date-hr', 'Channel'])['Hr'].count().unstack([1,2], fill_value=0)
print (df)
Date-hr D1-10    D1-11    D7-11
Channel    C1 C3    C2 C3    C2
User-ID                        
U1          2  1     1  0     0
U2          1  0     1  1     0
U4          0  0     0  0     1

def f(x):
    c = x.idxmax(axis=1).str[1]
    m = x.max(axis=1)
    s = pd.Series((list(zip(c, m))), index=x.index)
    return (s)

df = df.groupby(axis=1, level=0).apply(f)
print (df)
Date-hr    D1-10    D1-11    D7-11
User-ID                           
U1       (C1, 2)  (C2, 1)  (C2, 0)
U2       (C1, 1)  (C2, 1)  (C2, 0)
U4       (C1, 0)  (C2, 0)  (C2, 1)
...