【问题标题】:Pandas: Apply a function that returns the division between two rows, for multiple columnsPandas:应用一个函数,为多列返回两行之间的划分
【发布时间】:2021-10-20 13:52:02
【问题描述】:

我有一个按索引“年龄组”和“流失”分组的数据框

age group churn salary debt investments
21-30 0 5000 3000 2500
21-30 1 4000 2000 5000
31-40 0 6000 2500 1000
31-40 1 2000 2000 1000

我想创建一个新的数据框,返回每个数字列的 column[churn==1] / column[churn==0] 之间的除法

所需的数据框:

age group variation_salary variation_debt variation_investments
21-30 0.8 0.66 2
31-40 0.33 0.8 1

我该如何解决这个问题?

提前致谢!

【问题讨论】:

    标签: python pandas


    【解决方案1】:

    将年龄组和流失率设置为索引时,您可以选择带有.xs() 的子集,并且年龄组索引将确保您将相同的年龄组彼此划分:

    >>> df = df.set_index(['age group', 'churn'])
    >>> df.xs(1, 'index', 'churn') / df.xs(0, 'index', 'churn')
                 salary      debt  investments
    age group                                 
    21-30      0.800000  0.666667          2.0
    31-40      0.333333  0.800000          1.0
    

    然后您也可以在结果上调用.reset_index()

    【讨论】:

      【解决方案2】:

      您可以再次按age group分组,选择相关列,然后使用.last()获取组内churn==1对应的条目,.first()获取组内churn==0对应的条目团体。然后,将它们用于除法:

      g = df.groupby('age group')[['salary', 'debt', 'investments']]
      
      g.last() / g.first()
      

      结果:

                   salary      debt  investments
      age group                                 
      21-30      0.800000  0.666667          2.0
      31-40      0.333333  0.800000          1.0
      

      另一种方法:也可以在分组前按churn==1churn==0进行过滤,如下:

      g1 = df.loc[df['churn']==1].groupby('age group')[['salary', 'debt', 'investments']].first()
      
      g0 = df.loc[df['churn']==0].groupby('age group')[['salary', 'debt', 'investments']].first()
      
      g1 / g0
      

      结果:

                   salary      debt  investments
      age group                                 
      21-30      0.800000  0.666667          2.0
      31-40      0.333333  0.800000          1.0
      

      我们可以进一步微调到您想要的布局,如下:

      df_out = ((g.last() / g.first())
                    .add_prefix('variation_')
                    .reset_index()
               )
      

      或者,对于替代方法,使用:

      df_out = ((g1 / g0)
                    .add_prefix('variation_')
                    .reset_index()
               )
      

      结果:

      print(df_out)
      
        age group  variation_salary  variation_debt  variation_investments
      0     21-30          0.800000        0.666667                    2.0
      1     31-40          0.333333        0.800000                    1.0
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-06-06
        • 2014-03-26
        • 2019-11-26
        • 2017-06-22
        • 1970-01-01
        • 1970-01-01
        • 2018-06-07
        • 1970-01-01
        相关资源
        最近更新 更多