Pandas 使用max获取列

Pandas 使用max获取列,pandas,pivot,max,multi-index,argmax,Pandas,Pivot,Max,Multi Index,Argmax,df.head().info() 实际日期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

df.head().info()

实际日期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

..
当我应用pivot操作时,用户id为索引,列为

['date-hr', 'channel']
使用计数作为聚合函数

我为每个用户获取一行,主要索引为date hr,所有通道都在该日期hr值下,如:

    D1-10     D1-11 .....

    C1  C3    C2 C3 .....

U1  3    1    2   1 .....
现在,我需要的是每个“日期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)

是否可以省略输出列中多索引的第一级?在df.pivot_表(index=['id'],columns=['date-hr','channel'],margins=True,aggfunc='count')之后,省略第一级?@NikhilVerma-我在最后一个pandas版本
0.23.0
中对其进行了测试,是否可以升级?好的,我在更新pandas之后尝试了同样的方法,同样的问题我已经用我的初始df的信息更新了这个问题。有什么问题吗?@NikhilVerma-数据是否保密?我发现可能的问题,每个小组都有
NaN
s。
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)