Pandas groupby常用功能

Pandas groupby 常用功能


示例DataFrame

keyvalue
A10
A30
A20
B33
B22
B11

【sum】key内部求value的和

# key内部求和
gp = data.groupby(["key"])["value"].sum().reset_index() # reset_index重置index
gp.rename(columns={"value":"sum_of_value"},inplace=True) # rename改列名
indexkeysum_of_value
0A60
1B66

【cumsum】key内部value的累计和

# key内部求value的累计和
gp = data.groupby(["key"])["value"].cumsum().reset_index() 
gp.rename(columns={"value":"cumsum_of_value"},inplace=True)
indexrank_of_value
010
140
260
333
455
566

【prod】key内部求value的积

# key内部value全部相乘
gp = data.groupby(["key"])["value"].prod().reset_index()
gp.rename(columns={"value":"prod_of_value"},inplace=True)
indexkeysum_of_value
0A6000
1B7986

【mean】key内部求value的均值

# key内部求均值
gp = data.groupby(["key"])["value"].mean().reset_index()
gp.rename(columns={"value":"mean_of_value"},inplace=True)
indexkeymean_of_value
0A20
1B22

【max】key内部求value最大值

# key内部求最大值
gp = data.groupby(["key"])["value"].max().reset_index()
gp.rename(columns={"value":"max_of_value"},inplace=True)
indexkeymax_of_value
0A30
1B33

【min】key内部求value最小值

# key内部求最小值
gp = data.groupby(["key"])["value"].min().reset_index()
gp.rename(columns={"value":"min_of_value"},inplace=True)
indexkeymin_of_value
0A10
1B11

【idxmax】key内部value的最大值的index

注意,这里的index是原DataFrame中的index,例如A中value的最大值30的index在整个DataFrame中是1,而B中value的最大值33的index在整个DataFrame中是3。

# key内部求value最大值在原DataFrame中的index
gp = data.groupby(["key"])["value"].idxmax().reset_index()
gp.rename(columns={"value":"maxidx_of_value"},inplace=True)
indexkeymaxidx_of_value
0A1
1B3

【rank】key内部value的排名

目前的尝试,rank返回的DataFrame长度等于原长,排列顺序与原DataFrame一致。

# key内部value排名
gp = data.groupby(["key"])["value"].rank().reset_index()
gp.rename(columns={"value":"rank_of_value"},inplace=True)
indexrank_of_value
01.0
13.0
22.0
33.0
42.0
51.0

如果value有同值,例如将A中第二行的30改成20,rank会出现小数。

indexrank_of_value
01.0
12.5
22.5
33.0
42.0
51.0

常见特征提取

key每天的样本总量

用size可以实现统计“用户每天搜索次数”这样的特征,例如下面这个DataFrame,用户A在第1天和第二天的搜索次数(样本量)分别是1次和2次,用户B则在第一天搜索2次。

user_idday
A1
A2
A2
B1
B1
# 用户每天的总搜索次数
gp = data.groupby(["user_id","day"]).size().reset_index() 
gp.rename(columns={0:"count"},inplace=True)
indexuser_iddaycount
0A11
1A22
2B12

key每天取value的次数

同样,用size可以实现“用户每天搜索某品牌brand的次数(样本量)”之类的特征,只需要改变groupby中的内容即可。例如下面这个DataFrame,用户A在第1天搜索X2次,搜索Y1次,第2天搜索X1次。值得注意的是,如果没有发生过搜索,是不会显示出来的,例如“第2天搜索Y0次”是不会出现在结果中的。

user_idbrand_idday
AX1
AX1
AX2
AY1
# 用户每天搜索某品牌的总次数
gp = data.groupby(["user_id","brand_id","day"]).size().reset_index() 
gp.rename(columns={0:"count"},inplace=True)
indexuser_idbrand_iddaycount
0AX12
1AX21
2AY11

key在当天以前的访问次数总量

可以利用size和cumsum实现历史统计量,类似“用户在当天以前搜索某个品牌的总次数(不包括当天)”,基本思路是先用size统计每天关于该品牌的次数统计,然后用它做cumsum,就得到了包括当天的历史总次数,最后减去每天的次数统计即可。

user_idbrand_idday
AX1
AX2
AX2
AX3
AX4
# 第一步,求每天样本量
gp = data.groupby(["user_id","brand_id","day"]).size().reset_index() 
gp.rename(columns={0:"count"}, inplace=True)
# 第二步,利用第一步的结果求每天累计样本量
gp["cum_count"] = gp['count'].cumsum().reset_index()["count"]
# 第三步,去掉当天统计量
gp["cum_count_history"] = gp["cum_count"] - gp["count"]
indexuser_idbrand_iddaycum_count_history
0AX10
1AX21
2AX33
3AX44

key历史第几次取value

一般可以用rank实现“key内部value第几次取某个值”,例如“用户user_id历史第几次搜索品牌X”,这时一般要对时间列取rank()。例如下面这个DataFrame:

user_idbrand_idtimestamp
AX20180401
AY20180402
AX20180403
AY20180401
AY20180403
# 用户历史第几次搜索某个brand_id
gp = data.groupby(["user_id","brand_id"])["timestamp"].rank().reset_index()
gp.rename(columns={"timestamp":"rank"},inplace=True)
indexrank
01.0
12.0
22.0
31.0
43.0

key当天第几次取value

还可以实现“用户每天第几次搜索品牌X”这样的特征,例如下面这个DataFrame:

user_idbrand_iddayhour
AX110
AX111
AY116
AY115
AY114

首先按【用户-品牌-天】进行聚合,接下来用更小的可分的时间粒度(即小时)取rank。

# 用户当天第几次搜索某个brand_id
gp = data.groupby(["user_id","day","brand_id"])["hour"].rank().reset_index() 
gp.rename(columns={"hour":"rank"},inplace=True)
indexrank
01.0
12.0
23.0
32.0
41.0

参考资料

pandas groupby API

(仍在更新中)

  • 4
    点赞
  • 44
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值