【问题标题】:In Python Pandas, how to use like R dplyr mutate_each在 Python Pandas 中,如何像 R dplyr mutate_each 一样使用
【发布时间】:2018-03-29 21:47:55
【问题描述】:

在 Python Pandas 中,我想通过在多个列上执行多个聚合函数来添加列,例如 R dplyr mutate_each。 例如,Python Pandas 能否实现和下面的 R 脚本一样的处理?

R dplyr :

 iris %>%
   group_by(Species) %>%
   mutate_each(funs(min, max, mean), starts_with("Sepal"))

但是,我能够使用 Pandas 实现与 mutate 相同的处理。 如下代码所示,我可以执行一个聚合函数并添加一列。

R dplyr :

 iris %>% group_by(Species) %>% mutate(MaxSepalLen = max(Sepal.Length))

Python Pandas :

 iris.assign(MaxSepalLen = iris.groupby("Species")["Sepal.Length"].transform('max'))

【问题讨论】:

    标签: python r pandas dplyr


    【解决方案1】:

    在 Pandas 中,这可以以更冗长的方式完成。

    首先,让我们准备数据:

    import pandas as pd
    import numpy as np
    from sklearn.datasets import load_iris
    iris_data = load_iris()
    iris = pd.DataFrame(iris_data.data, columns = [c[0:3] + c[6] for c in iris_data.feature_names])
    iris['Species'] = iris_data.target_names[iris_data.target]
    

    现在我们可以模仿mutate_each管道:

    # calculate the aggregates
    pivot = iris.groupby("Species")[iris.columns[iris.columns.str.startswith('sepal')]
                                   ].aggregate(['min', 'max', np.mean])
    # name the aggregates
    pivot.columns = pivot.columns.get_level_values(0) + pivot.columns.get_level_values(1)
    # merge aggregates with the original dataframe
    new_iris = iris.merge(pivot, left_on='Species', right_index=True)
    

    pivot 表实际上是一个小型数据透视表:

                seplmin  seplmax  seplmean  sepwmin  sepwmax  sepwmean
    Species                                                           
    setosa          4.3      5.8     5.006      2.3      4.4     3.418
    versicolor      4.9      7.0     5.936      2.0      3.4     2.770
    virginica       4.9      7.9     6.588      2.2      3.8     2.974
    

    new_iris 是一个 150x11 的表,其中包含来自 irispivot 的所有列组合,与 dplyr 输出的内容相同。

    【讨论】:

    • 感谢您的回复。我会检查的。
    【解决方案2】:

    mutate_eachmutateacross 取代。

    你可以在 python 中试试这个:

    >>> from datar.all import f, group_by, starts_with, mutate, across, max, min, mean
    >>> from datar.datasets import iris
    >>> 
    >>> iris >> \
    ...    group_by(f.Species) >> \
    ...    mutate(across(starts_with("Sepal"), [min, max, mean]))
         Sepal_Length  Sepal_Width  Petal_Length  Petal_Width    Species  Sepal_Length_1  Sepal_Length_2  Sepal_Length_3  Sepal_Width_1  Sepal_Width_2  Sepal_Width_3
            <float64>    <float64>     <float64>    <float64>   <object>       <float64>       <float64>       <float64>      <float64>      <float64>      <float64>
    0             5.1          3.5           1.4          0.2     setosa             4.3             5.8           5.006            2.3            4.4          3.428
    1             4.9          3.0           1.4          0.2     setosa             4.3             5.8           5.006            2.3            4.4          3.428
    2             4.7          3.2           1.3          0.2     setosa             4.3             5.8           5.006            2.3            4.4          3.428
    3             4.6          3.1           1.5          0.2     setosa             4.3             5.8           5.006            2.3            4.4          3.428
    ..            ...          ...           ...          ...        ...             ...             ...             ...            ...            ...            ...
    4             5.0          3.6           1.4          0.2     setosa             4.3             5.8           5.006            2.3            4.4          3.428
    145           6.7          3.0           5.2          2.3  virginica             4.9             7.9           6.588            2.2            3.8          2.974
    146           6.3          2.5           5.0          1.9  virginica             4.9             7.9           6.588            2.2            3.8          2.974
    147           6.5          3.0           5.2          2.0  virginica             4.9             7.9           6.588            2.2            3.8          2.974
    148           6.2          3.4           5.4          2.3  virginica             4.9             7.9           6.588            2.2            3.8          2.974
    149           5.9          3.0           5.1          1.8  virginica             4.9             7.9           6.588            2.2            3.8          2.974
    
    [Groups: Species (n=3)]
    [150 rows x 11 columns]
    

    我是datar 包的作者。

    【讨论】:

      猜你喜欢
      • 2015-04-23
      • 1970-01-01
      • 2018-11-20
      • 2015-10-26
      • 2021-11-04
      • 1970-01-01
      • 2019-04-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多