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