【问题标题】:groupby function based off multiple rows基于多行的 groupby 函数
【发布时间】:2021-06-14 05:08:24
【问题描述】:

这是我的数据:

id date period score
1 2015-01-01 start 5
1 2015-01-15 end 10
2 2015-01-01 start 2
2 2015-01-07 mid_1 7
2 2015-01-14 end 10

这些是一段时间内的分数记录。我已经对句点列进行了编码,以便您理解。

如何找到从开始到结束的分数差异或百分比变化?

如果我这样做pd.groupby,我可以找到最小或最大日期,但我如何将其与最小或最大日期的分数相匹配?

我不在乎计算使用日期还是期间,我只需要弄清楚如何匹配。

我想要如下所示的数据:

id change_in_score_start_to_end
1 100%
2 400%

【问题讨论】:

    标签: python pandas pandas-groupby


    【解决方案1】:

    这是另一种方法:

    代码:

    import pandas as pd
    
    df = pd.read_csv('test.csv')
    df = df.drop('date', axis=1).set_index(['id', 'period']).unstack(1).droplevel(0 , axis=1)
    
    df['change_in_score_start_to_end'] = ((df['end']/df['start'] -1)*100).map('{:.0f}%'.format)
    print(df)
    

    输出:

    period   end  mid_1  start change_in_score_start_to_end
    id                                                     
    1       10.0    NaN    5.0                         100%
    2       10.0    7.0    2.0                         400%
    

    【讨论】:

      【解决方案2】:

      一个选项是pivot:

      new_df = df.pivot(index='id', columns='period', values='score')
      

      new_df:

      period   end  mid_1  start
      id                        
      1       10.0    NaN    5.0
      2       10.0    7.0    2.0
      

      然后可以在endstart 列上按行完成计算:

      out = (
          (((new_df['end'] - new_df['start']) / new_df['start']) * 100)
              .map('{:.0f}%'.format)
              .reset_index(name='change_in_score_start_to_end')
      )
      

      out:

         id change_in_score_start_to_end
      0   1                         100%
      1   2                         400%
      

      完整的工作示例:

      import pandas as pd
      
      df = pd.DataFrame({
          'id': [1, 1, 2, 2, 2],
          'date': ['2015-01-01', '2015-01-15', '2015-01-01', '2015-01-07',
                   '2015-01-14'],
          'period': ['start', 'end', 'start', 'mid_1', 'end'],
          'score': [5, 10, 2, 7, 10]
      })
      
      new_df = df.pivot(index='id', columns='period', values='score')
      out = (
          (((new_df['end'] - new_df['start']) / new_df['start']) * 100)
              .map('{:.0f}%'.format)
              .reset_index(name='change_in_score_start_to_end')
      )
      
      print(out)
      

      【讨论】:

        猜你喜欢
        • 2021-11-19
        • 1970-01-01
        • 2023-01-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-10-10
        相关资源
        最近更新 更多