python:dataframe groupby后agg、apply、transfrom用法

import pandas as pd
data = pd.DataFrame({'name':['wencky','stany','barbio','barbio'],
                      'age':[29,29,3,10],
                      'gender':['w','m','m', 'w']})

# 1 transform可用,agg和apply得到NaN。
data["a"] = data.groupby("gender")["age"].agg(lambda x: x.mean())
# 输出
name  age gender   a
0  wencky   29      w NaN
1   stany   29      m NaN
2  barbio    3      m NaN
3  barbio   10      w NaN

data["a"] = data.groupby("gender")["age"].apply(lambda x: x.mean())
# 输出
name  age gender   a
0  wencky   29      w NaN
1   stany   29      m NaN
2  barbio    3      m NaN
3  barbio   10      w NaN

data["a"] = data.groupby("gender")["age"].transform(lambda x: x.mean())
# 输出
     name  age gender     a
0  wencky   29      w  19.5
1   stany   29      m  16.0
2  barbio    3      m  16.0
3  barbio   10      w  19.5

# 2
data= data.groupby("gender")["age"].agg(lambda x: x.mean())
# 输出
gender
m    16.0
w    19.5

data= data.groupby("gender")["age"].apply(lambda x: x.mean())

# 输出
gender
m    16.0
w    19.5

data= data.groupby("gender")["age"].transform(lambda x: x.mean())
# 输出
0    19.5
1    16.0
2    16.0
3    19.5

# 3
data = data.groupby("gender").agg(lambda x: x["age"].mean())
# 报错

data = data.groupby("gender").apply(lambda x: x["age"].mean())
# 输出
gender
m    16.0
w    19.5

data = data.groupby("gender").transform(lambda x: x["age"].mean())
# 报错

# 4 该用法不可用
data["c"] = data.groupby("gender").agg(lambda x: x["age"].mean())
# 报错

data["c"] = data.groupby("gender").apply(lambda x: x["age"].mean())
# 输出
     name  age gender   c
0  wencky   29      w NaN
1   stany   29      m NaN
2  barbio    3      m NaN
3  barbio   10      w NaN

data["c"] = data.groupby("gender").transform(lambda x: x["age"].mean())
# 报错


# 以下5-8用法使用agg均报错:valueError: Must produce aggregated value

# 5
data["b"]= data.groupby("gender")["age"].agg(lambda x: x+1)
# 输出
valueError: Must produce aggregated value

data["b"]= data.groupby("gender")["age"].apply(lambda x: x+1)
# 输出
     name  age gender   b
0  wencky   29      w  30
1   stany   29      m  30
2  barbio    3      m   4
3  barbio   10      w  11

data["b"]= data.groupby("gender")["age"].transform(lambda x: x+1)
# 输出
     name  age gender   b
0  wencky   29      w  30
1   stany   29      m  30
2  barbio    3      m   4
3  barbio   10      w  11

# 6 两种用法结果一致
data = data.groupby("gender")["age"].apply(lambda x: x+1)
data = data.groupby("gender")["age"].transform(lambda x: x+1)
# 输出
0    30
1    30
2     4
3    11

# 7
data = data.groupby("gender").apply(lambda x: x["age"]+1)
# 输出
gender   
m       1    30
        2     4
w       0    30
        3    11

data = data.groupby("gender").transform(lambda x: x["age"]+1)
# 报错

# 8
data["d"] = data.groupby("gender").apply(lambda x: x["age"]+1)
# 报错

data["d"] = data.groupby("gender"). transform (lambda x: x["age"]+1)
# 报错


  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值