【问题标题】:How to generate a column from the unique groupby combinations in a cumulative way?如何以累积方式从唯一的 groupby 组合生成列?
【发布时间】:2022-11-29 02:16:50
【问题描述】:

我的数据如下所示:

df_dict = {
    'Year' : [2021, 2021, 2021, 2021, 2022, 2022, 2022, 2022],
    'Week of Year' : [1, 1, 2, 2, 10, 10, 11, 11]
}
  
df = pd.DataFrame(df_dict)

我怎样才能生成一个新列,比如 Week Order 以累积方式显示独特的 Year, Week of Year 组合。结果数据集将是这样的:

    Year    Week of Year    Week Order
0   2021    1               1
1   2021    1               1
2   2021    2               2
3   2021    2               2
4   2022    10              3
5   2022    10              3
6   2022    11              4
7   2022    11              4

【问题讨论】:

    标签: python pandas


    【解决方案1】:

    您可以使用 pandas.factorize

    df['Week Order'] = df.agg(tuple, axis=1).factorize()[0]+1
    

    # 输出 :

    print(df)
    
       Year  Week of Year  Week Order
    0  2021             1          1
    1  2021             1          1
    2  2021             2          2
    3  2021             2          2
    4  2022            10          3
    5  2022            10          3
    6  2022            11          4
    7  2022            11          4
    

    【讨论】:

    • 而不是分配,您可以通过分配 df['WeekOrder']=df.agg(tuple, axis=1).factorize()[0]+1) 很好地创建一个新列
    • 更好/更短,谢谢 Naveed。
    【解决方案2】:

    另一种选择,sort_values + duplicated + cumsum,即每个不重复的年+周将订单增加一个:

    cols = ['Year', 'Week of Year']
    df['Week Order'] = (~df.sort_values(cols).duplicated(cols)).cumsum()
    
    df
       Year  Week of Year  Week Order
    0  2021             1           1
    1  2021             1           1
    2  2021             2           2
    3  2021             2           2
    4  2022            10           3
    5  2022            10           3
    6  2022            11           4
    7  2022            11           4
    

    【讨论】:

      【解决方案3】:

      这是一种方法

      df['week order']=1
      df['week order']=df['week order'].mask(df.duplicated()).cumsum().ffill().astype(int) 
      df
      
      

      或者

      df['week order'] = (df.duplicated()).cumsum().shift(-1).ffill().astype(int)
      
          Year    Week of Year    week order
      0   2021               1        1
      1   2021               1        1
      2   2021               2        2
      3   2021               2        2
      4   2022              10        3
      5   2022              10        3
      6   2022              11        4
      7   2022              11        4
      

      【讨论】:

        猜你喜欢
        • 2021-10-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-01-03
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多