Pandas apply transform agg 函数区别

  1. apply 传入的为DataFrame,transform和agg传入的为Series。

  2. 可通过打印传入的参数,进行本质比较,DF和Series可做的操作不同;如列相加只能DF。

  3. transform返回值其索引和列与原始DataFrame相同,agg必为聚会结果及组数,apply看具体应用函数的行为即可能为与原大小一样,也可能为聚合后的即只有组数。

  • apply举例,传入DF,即可返回聚合大小,也可返回原大小。

  • import pandas as pd
    
    data = {
        'user_id': [1, 2, 3, 4, 5, 6],
        '渠道': ['Alipay', 'WeiChat', 'Alipay', 'WeiChat', 'Alipay', 'WeiChat'],
        '金额': [100, 150, 120, 180, 90, 200]
    }
    
    df = pd.DataFrame(data)
    
    def convert(item):
        print(item)
        print('*'*50)
        return item.max()
    
    df2 = df.groupby(['渠道']).apply(convert)
    print(df2)
    '''output
       user_id      渠道   金额
    0        1  Alipay  100
    2        3  Alipay  120
    4        5  Alipay   90
    **************************************************
       user_id       渠道   金额
    1        2  WeiChat  150
    3        4  WeiChat  180
    5        6  WeiChat  200
    **************************************************
             user_id       渠道   金额
    渠道                            
    Alipay         5   Alipay  120
    WeiChat        6  WeiChat  200
    
    '''
  • import pandas as pd
    
    data = {
        'user_id': [1, 2, 3, 4, 5, 6],
        '渠道': ['Alipay', 'WeiChat', 'Alipay', 'WeiChat', 'Alipay', 'WeiChat'],
        '金额': [100, 150, 120, 180, 90, 200]
    }
    
    df = pd.DataFrame(data)
    
    def convert(item):
        print(item)
        print('*'*50)
        return item
    
    df2 = df.groupby(['渠道']).apply(convert)
    print(df2)
    '''output
       user_id      渠道   金额
    0        1  Alipay  100
    2        3  Alipay  120
    4        5  Alipay   90
    **************************************************
       user_id       渠道   金额
    1        2  WeiChat  150
    3        4  WeiChat  180
    5        6  WeiChat  200
    **************************************************
       user_id       渠道   金额
    0        1   Alipay  100
    1        2  WeiChat  150
    2        3   Alipay  120
    3        4  WeiChat  180
    4        5   Alipay   90
    5        6  WeiChat  200
    '''
  • agg举例 传入Series,返回聚合大小。

  • import pandas as pd
    
    data = {
        'user_id': [1, 2, 3, 4, 5, 6],
        '渠道': ['Alipay', 'WeiChat', 'Alipay', 'WeiChat', 'Alipay', 'WeiChat'],
        '金额': [100, 150, 120, 180, 90, 200]
    }
    
    df = pd.DataFrame(data)
    
    def convert(item):
        print(item)
        print('*'*50)
        return item.max()
    
    df2 = df.groupby(['渠道']).agg(convert)
    print(df2)
    '''ouotput
    0    1
    2    3
    4    5
    Name: user_id, dtype: int64
    **************************************************
    1    2
    3    4
    5    6
    Name: user_id, dtype: int64
    **************************************************
    0    100
    2    120
    4     90
    Name: 金额, dtype: int64
    **************************************************
    1    150
    3    180
    5    200
    Name: 金额, dtype: int64
    **************************************************
             user_id   金额
    渠道                   
    Alipay         5  120
    WeiChat        6  200
    '''
  • transform举例 传入Series,返回原大小

  • import pandas as pd
    
    data = {
        'user_id': [1, 2, 3, 4, 5, 6],
        '渠道': ['Alipay', 'WeiChat', 'Alipay', 'WeiChat', 'Alipay', 'WeiChat'],
        '金额': [100, 150, 120, 180, 90, 200]
    }
    
    df = pd.DataFrame(data)
    
    def convert(item):
        print(item)
        print('*'*50)
        return item.max()
    
    df2 = df.groupby(['渠道']).transform(convert)
    print(df2)
    '''output
    0    1
    2    3
    4    5
    Name: user_id, dtype: int64
    **************************************************
    0    100
    2    120
    4     90
    Name: 金额, dtype: int64
    **************************************************
       user_id   金额
    0        1  100
    2        3  120
    4        5   90
    **************************************************
    1    2
    3    4
    5    6
    Name: user_id, dtype: int64
    **************************************************
    1    150
    3    180
    5    200
    Name: 金额, dtype: int64
    **************************************************
       user_id   金额
    0        5  120
    1        6  200
    2        5  120
    3        6  200
    4        5  120
    5        6  200
    '''

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值