Pandas 使用max获取列
df.head().info() 实际日期hr看起来像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
'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)