Pandas 分层数据透视表获取最大列

Pandas hierarchical pivot get column with max

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)

实际 日期-小时 看起来像

'2017-02-14--15' 

id 是一个 string

我有一个像这样的 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

..

当我应用数据透视操作时,用户 ID 作为索引,列作为

['date-hr', 'channel']

使用 count 作为聚合函数。

我为每个用户获得 1 行,主要索引为 date-hr 以及该 date-hr 值下的所有频道,例如:

    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) .....

我不知道如何从我的数据中获得这种转换。

您可以创建自定义函数:

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)