【问题标题】:Is there a way in pandas to group rows in a dataframe based on a quantity in one column?熊猫有没有办法根据一列中的数量对数据框中的行进行分组?
【发布时间】:2021-09-10 22:48:32
【问题描述】:

想象一下我有一个这样的数据框:

ID Quantity
AAA 10
BBB 30
CCC 30
DDD 10
EEE 20

有没有办法添加一个“组”列,以便我可以创建类似数量的组?

例如,如果我想要数量总和约为 50 的组(不必精确):

ID Quantity Group
AAA 10 1
BBB 30 1
CCC 30 2
DDD 10 1
EEE 20 2

或数量总和约为 30 的组:

ID Quantity Group
AAA 10 1
BBB 30 2
CCC 30 3
DDD 10 1
EEE 20 1

我有非常大量的数据,想分批处理,但需要保证每批的数量列之和大致相等。

我希望这个问题相当清楚。非常感谢您非常提前。

【问题讨论】:

  • 到目前为止您尝试过什么?您可能想要改写您的问题,因为您实际上并不是在进行传统意义上的“分组依据”,而是想要分配一个列 GROUP 并为每个范围分配一个组号。您还应该更具体地了解您的 Range 需要是什么。我会在一分钟内发布一个示例。
  • 您在寻找最佳解决方案吗?它看起来像Multiple Knapsacks。这是一个NP完全问题。如果您只是想要一个解决方案,这可能很容易但很慢。
  • 天啊,谢谢。 @Corralien 100% 正确,这就像多个背包除了我没有“背包”数量的上限。事实上,我完全想多了,但你让我得到了一个答案,我将在下面发布。

标签: python pandas dataframe


【解决方案1】:

正如我在上面的评论中指出的那样,我完全想多了,但这里的 cmets 确实帮助了我。

我有一个包含 55,000 个类别的 150,000,000 个事件的数据集。我需要分批处理这些数据,但我必须确保一个类别中的所有事件都在同一个批次中处理(尽管一个批次可能包含多个类别。)

如原始问题所述,我有一个按类别分组的事件数据框,分为三列:idcategoryevent_countevent_count 只是特定类别中所有事件行的总和。

我最终只是编写了一个糟糕的 Python 循环,它将类别添加到一个组中,直到该组中 event_count 的总和 > 1,500,000(将数据集分成 100 个组的任意数字)。

group_counter = 1
event_counter = 0
for i in event.index:
  event_counter += event.loc[i, "event_count"]
  if event_counter < 1500000:
    event.loc[i, "category"] = int(group_counter)
  else:
    event_counter = row.event_count
    group_counter += 1
    event.loc[i, "category"] = int(group_counter)

超级愚蠢,可能有一百万种更好的方法可以做到这一点,但这正是我所需要的。

我想多了,Multiple Knapsacks 问题的提醒是一个完美的推动。

【讨论】:

    【解决方案2】:

    正如@corrilien 所提到的,有更有效的解决方案。我可能会将所有逻辑放入一个函数中并应用它,而不是按顺序执行所有操作。

    >>> import pandas as pd
    >>> data = {'ID': ['AAA', 'BBB', 'CCC', 'DDD', 'EEE'], 
            'Quantity': [10, 30, 30, 10, 20]
           }
    >>> df = pd.DataFrame(data)
    >>> df
        ID  Quantity
    0  AAA        10
    1  BBB        30
    2  CCC        30
    3  DDD        10
    4  EEE        20
    
    >>> df['Group'] = df.apply(lambda row: 3 if row.Quantity > 29 else (1 if row.Quantity <= 10 else 2), axis=1)
    >>> df
        ID  Quantity  Group
    0  AAA        10      1
    1  BBB        30      3
    2  CCC        30      3
    3  DDD        10      1
    4  EEE        20      2
    

    【讨论】:

      猜你喜欢
      • 2020-10-21
      • 2013-07-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-04-23
      • 2022-01-25
      • 1970-01-01
      相关资源
      最近更新 更多