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

时间:2018-05-22 07:58:03

标签: pandas pivot max multi-index argmax

df.head()。信息()

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 字符串

我有一个像:

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

..

当我使用user-id作为索引和列

来应用pivot操作时
['date-hr', 'channel']

使用 count 作为聚合函数。

我为主要索引为date-hr的每个用户提供1行,并且在该一个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) .....

我无法弄清楚如何从我的数据中获得这种转换。

1 个答案:

答案 0 :(得分:1)

您可以创建自定义功能:

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)