zoukankan      html  css  js  c++  java
  • Pandas transform函数

    作者|B. Chen
    编译|VK
    来源|Towards Datas Science

    Pandas是一个惊人的库,它包含了大量用于操作数据的内置函数。其中,transform()在处理行或列时非常有用。

    在本文中,我们将介绍以下最常用的Pandas transform()用途:

    1. 转换值

    2. 组合groupby()

    3. 过滤数据

    4. 在组级别处理缺失值

    请查看我的Github repo以获取源代码;https://github.com/BindiChen/machine-learning/blob/master/data-analysis/013-pandas-transform/pandas-transform.ipynb

    1.转换值

    我们来看看pd.transform(func, axis=0)

    • 第一个参数func指定用于操作数据的函数。它可以是函数、字符串函数名、函数列表或轴标签->函数的字典

    • 第二个参数轴指定函数应用于哪个轴。0表示对每列应用func,1表示对每行应用func。

    让我们看看transform()是如何在一些示例的帮助下工作的。

    函数

    我们可以把函数传递给func。例如

    df = pd.DataFrame({'A': [1,2,3], 'B': [10,20,30] })
    
    def plus_10(x):
        return x+10
    
    df.transform(plus_10)
    

    也可以使用lambda表达式。下面是plus_10()的lambda等价形式:

    df.transform(lambda x: x+10)
    

    字符串函数

    我们可以将任何有效的Pandas字符串函数传递给func,例如'sqrt':

    df.transform('sqrt')
    

    函数列表

    func可以是函数的列表。例如,来自NumPy的sqrt和exp:

    df.transform([np.sqrt, np.exp])
    

    轴标签->函数的字典

    func可以是轴标签->函数的字典。例如

    df.transform({
        'A': np.sqrt,
        'B': np.exp,
    })
    

    2.组合groupby()

    Pandas transform()最引人注目的用法之一是组合groupy()结果。

    让我们通过一个例子来看看这是如何工作的。假设我们有一个关于连锁餐厅的数据集

    df = pd.DataFrame({
      'restaurant_id': [101,102,103,104,105,106,107],
      'address': ['A','B','C','D', 'E', 'F', 'G'],
      'city': ['London','London','London','Oxford','Oxford', 'Durham', 'Durham'],
      'sales': [10,500,48,12,21,22,14]
    })
    

    我们可以看到,每个城市都有多家餐厅在销售。我们想知道“每一家餐厅在本市的销售额占比是多少”。预期输出为:

    在这个计算中最棘手的部分是,我们需要得到一个城市的总销售额,并将其合并到数据中,以得到百分比。

    有两种解决方案:

    1. groupby()、apply()和merge()

    2. groupby()和transform()

    解决方案1:groupby()、apply()和merge()

    第一种解决方案是使用groupby()分割数据,并使用apply()聚合每个组,然后使用merge()将结果合并回原始数据帧中

    第1步:使用groupby()和apply()计算城市销售总额
    city_sales = df.groupby('city')['sales']
                 .apply(sum).rename('city_total_sales').reset_index()
    

    groupby('city')通过在city列上分组来拆分数据。对于每个组,函数sum应用于sales列,以计算每个组的总和。最后,将新列重命名为city_total_sales并重置索引(注意:需要reset_inde()来清除groupby('city')生成的索引。

    此外,Pandas还有一个内置的sum()函数,下面是Pandas sum()的等效函数:

    city_sales = df.groupby('city')['sales']
                 .sum().rename('city_total_sales').reset_index()
    
    第2步:使用merge()函数合并结果
    df_new = pd.merge(df, city_sales, how='left')
    

    使用merge()和left outer join的how='left'将组结果合并回到原始的DataFrame中

    第3步:计算百分比

    最后,可以计算并格式化百分比。

    df_new['pct'] = df_new['sales'] / df_new['city_total_sales']
    df_new['pct'] = df_new['pct'].apply(lambda x: format(x, '.2%'))
    

    这当然是我们的工作。但这是一个多步骤的过程,需要额外的代码才能以我们需要的形式获取数据。

    我们可以使用transform()函数有效地解决这个问题

    解决方案2:groupby()和transform()

    这个解决方案改变了游戏规则。一行代码就可以解决应用和合并问题。

    步骤1:使用groupby()和transform()计算城市销售总额

    转换函数在执行转换后保留与原始数据集相同数量的项。因此,使用groupby后跟transform(sum)的单行步骤返回相同的输出。

    df['city_total_sales'] = df.groupby('city')['sales']
                               .transform('sum')
    

    第2步:计算百分比

    最后,这和求百分比是一样的。

    df['pct'] = df['sales'] / df['city_total_sales']
    df['pct'] = df['pct'].apply(lambda x: format(x, '.2%'))
    

    3.过滤数据

    transform()也可用于过滤数据。在这里,我们试图获得该市总销售额超过40的记录

    df[df.groupby('city')['sales'].transform('sum') > 40]
    

    4.在组级别处理丢失的值

    Pandas transform()的另一个用法是在组级别处理丢失的值。让我们用一个例子来看看这是如何工作的。

    这里有一个数据帧供演示

    df = pd.DataFrame({
        'name': ['A', 'A', 'B', 'B', 'B', 'C', 'C', 'C'],
        'value': [1, np.nan, np.nan, 2, 8, 2, np.nan, 3]
    })
    

    在上面的示例中,可以按名称将数据分成三组,每个组都缺少值。替换缺失值的常见解决方案是用平均值替换NaN。

    让我们看看每组的平均值。

    df.groupby('name')['value'].mean()
    name
    A    1.0
    B    5.0
    C    2.5
    Name: value, dtype: float64
    

    在这里,我们可以使用transform()将缺少的值替换为组平均值。

    df['value'] = df.groupby('name')
                    .transform(lambda x: x.fillna(x.mean()))
    


    你可以在我的Github上获取源代码:https://github.com/BindiChen/machine-learning/blob/master/data-analysis/013-pandas-transform/pandas-transform.ipynb

    原文链接:https://towardsdatascience.com/when-to-use-pandas-transform-function-df8861aa0dcf

    欢迎关注磐创AI博客站:
    http://panchuang.net/

    sklearn机器学习中文官方文档:
    http://sklearn123.com/

    欢迎关注磐创博客资源汇总站:
    http://docs.panchuang.net/

  • 相关阅读:
    WPF获取程序版本号(Version)的方法
    WPF中Popup等弹窗的位置不对(偏左或者偏右)
    WPF中Expander与ListBox(ItemsControl)嵌套中的问题
    WPF自定义Button样式(按钮长度随Content长度自适应)
    WPF解决当ScrollViewer中嵌套ItemsControl时,不能使用鼠标来滚动翻页
    WPF中Window的ShowInTaskbar、Owner和Topmost属性
    WPF通过<x:Array>直接为ListBox的ItemsSource赋值
    常用的谓词和逻辑运算符
    利用OVER开窗函数分页
    一个单表查询的示例
  • 原文地址:https://www.cnblogs.com/panchuangai/p/13767660.html
Copyright © 2011-2022 走看看