【问题标题】:SQL Server or Pandas Rank / Numbering a Window Function by PartitionSQL Server 或 Pandas 排名/按分区编号窗口函数
【发布时间】:2021-10-09 23:15:10
【问题描述】:

我有一个如下表,我想在其中对类别中的 PartNumber 组进行排名,同时保持 LineItem 顺序

这是起始表 -->

Category Line Item Part Number
Apple 1 Granny Smith
Apple 2 Granny Smith
Apple 3 Fuji
Apple 4 Fuji
Banana 1 Chiquita
Banana 2 Chiquita
Banana 3 Dole
Banana 4 Dole
Banana 5 Del Monto
Banana 6 Del Monto

这是我的目标表 -->

Category Line Item Part Number Rank Order
Apple 1 Granny Smith 1
Apple 2 Granny Smith 1
Apple 3 Fuji 2
Apple 4 Fuji 2
Banana 1 Chiquita 1
Banana 2 Chiquita 1
Banana 3 Dole 2
Banana 4 Dole 2
Banana 5 Del Monto 3
Banana 6 Del Monto 3

在这种情况下,需要保留订单项订单。我尝试使用 SQL 分区和排名,但它们是按零件编号而不是行项目排序的。

SELECT 
  Category,
  LineItem,
  PartNumber,
  DENSE_RANK() OVER (PARTITION BY Category ORDER BY PartNumber ASC)
FROM TABLE

如果这不可能,Pandas 中是否有类似的选项会产生类似的结果?

【问题讨论】:

    标签: python sql sql-server pandas


    【解决方案1】:

    听起来您需要按Category, PartNumber 的最低LineItem 订购DENSE_RANK

    SELECT 
      Category,
      LineItem,
      PartNumber,
      DENSE_RANK() OVER (PARTITION BY Category ORDER BY MinLineItem)
    FROM (
        SELECT *,
          MinLineItem = MIN(LineItem) OVER (PARTITION BY Category, PartNumber)
        FROM [TABLE]
    ) t
    

    db<>fiddle

    【讨论】:

      【解决方案2】:

      pandas 中使用groupby transform + factorize,如@Scott Boston's answer to Counting occurrence of values after using groupby on multiple pandas columns 推荐的那样:

      df['Rank Order'] = (
          df.groupby('Category')['Part Number']
              .transform(lambda s: s.factorize()[0] + 1)
      )
      

      *factorize 会将每组零件编号转换为枚举类型,以确保等级按出现的数字升序显示。这与 groupby rank 不同,后者将使用排序方法。

      df:

        Category  Line Item   Part Number  Rank Order
      0    Apple          1  Granny Smith           1
      1    Apple          2  Granny Smith           1
      2    Apple          3          Fuji           2
      3    Apple          4          Fuji           2
      4   Banana          1      Chiquita           1
      5   Banana          2      Chiquita           1
      6   Banana          3          Dole           2
      7   Banana          4          Dole           2
      8   Banana          5     Del Monto           3
      9   Banana          6     Del Monto           3
      

      设置和导入:

      import pandas as pd
      
      df = pd.DataFrame({
          'Category': ['Apple', 'Apple', 'Apple', 'Apple', 'Banana', 'Banana',
                       'Banana', 'Banana', 'Banana', 'Banana'],
          'Line Item': [1, 2, 3, 4, 1, 2, 3, 4, 5, 6],
          'Part Number': ['Granny Smith', 'Granny Smith', 'Fuji', 'Fuji', 'Chiquita',
                          'Chiquita', 'Dole', 'Dole', 'Del Monto', 'Del Monto']
      })
      

      【讨论】:

        猜你喜欢
        • 2018-09-12
        • 1970-01-01
        • 1970-01-01
        • 2013-07-20
        • 2018-01-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-05-25
        相关资源
        最近更新 更多