【问题标题】:filter dataframe by maximum element from groupby pair按 groupby 对中的最大元素过滤数据帧
【发布时间】:2018-01-14 02:24:01
【问题描述】:

我有一个四列的数据框

df=DataFrame({'order_id':[134,101,131,159,101,189,120,102,134,130,231,421,141,129,141,101],\
          'user_id':[24,10,24,12,24,10,10,24,21,12,12,10,12,17,24,12],
          'product_id':[1004,1041,1078,1001,1001,1074,1001,1019,1021,1004,1001,1010,1004,1004,1017,1004],
         'sector':['a','a','b','d','c','a','c','a','c','a','b','c','a','b','a','a']})

order_id    product_id  sector  user_id
    120      1001          c     10
    421      1010          c     10
    101      1041          a     10
    189      1074          a     10
    159      1001          d     12
    231      1001          b     12
    130      1004          a     12
    141      1004          a     12
    101      1004          a     12
    129      1004          b     17
    134      1021          c     21
    101      1001          c     24
    134      1004          a     24
    141      1017          a     24
    102      1019          a     24
    131      1078          b     24

对于每个 product_id,我想通过选择每个 (product_id,user_id) 的行来过滤数据框 order_id 值大于与 (product_id, user_id) 对关联的最大 order_id 的对

例如product_id 1001,与user_id 10关联的最大order_id为120,最大order_id 与 user_id 12 关联的是 231,对于 user_id 24,最大 order_id 是 101,所以对于 product_id 1001,我会 喜欢返回DataFrame

df2=DataFrame({'order_id':[421,189,134,141,102,131],
'product_id':[1010, 1074,1004,1017,1019,1078],
'sector':['c','a','a','a','a','b'],
'user_id':[10,10,24,24,24,24]})

order_id    product_id  sector  user_id
    421        1010       c         10
    189        1074       a         10
    134        1004       a         24
    141        1017       a         24
    102        1019       a         24
    131        1078       b         24

对于 product_id 1004,没有与 user_id 10 关联的数据,因此不返回任何行。对于 user_id 12 最大的 order_id 为 141 并与 1004 关联。由于与 user_id 12 关联的 order_id 没有更大,因此不返回任何行。 对于user_id 17,只有一个条目,它与product_id 1004相关联,所以没有其他product_id 与 user_id 17 关联。不能有更大的 order_id。最后,对于user_id 24,关联的最大order_id product_id 1004 为 134。在这种情况下 product_id 1017 的 order_id 为 141,因此必须返回其行。

总结product_id 1004的输出是

  order_id  product_id  sector  user_id
    141        1017       a        24

我想对所有 product_id 重复此操作,并将数据帧存储在列表中

我认为解决方案的中心是按 user_id 分组,然后过滤 order_id 和 product_id,但我坚持这样做

df3=df.groupby(['user_id'])
for key, val in df3:
    d=val.sort_values(['order_id','product_id'])
    print d

【问题讨论】:

  • 到目前为止您尝试过什么?什么不工作?
  • 我不明白你的问题。如果(对于product_id 1001),order_id 的最大值为 231。为什么在您的预期输出中order_id 的值小于此阈值?
  • @Alexander 与 product_id 1001 和 user_id 12 关联的最大订单 _id 确实是 231。不需要返回任何行,因为 user_id 12 的最大 order_id 是 231。我只想要超过最大值的 order_id给定 user_id 的 product_id 顺序。这个问题很混乱,我尽力总结了。
  • 我还是不明白你的逻辑。您可能需要考虑扩展您的示例。
  • 提供了其他示例

标签: python pandas


【解决方案1】:

我不确定这是目前最有效的解决方案,但它确实有效:

def get_dataframe_for_product_id(your_input_df, wanted_product_id):
    df2 = your_input_df.groupby(['user_id'])
    result = pd.DataFrame([],columns=your_input_df.columns)
    for key, val in df2:
        result = pd.concat([result, val[val.order_id > val[val.product_id == wanted_product_id].order_id.max()]])
    return result

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-02-16
    • 2022-01-07
    • 1970-01-01
    • 2018-02-20
    • 1970-01-01
    • 1970-01-01
    • 2011-08-28
    • 2020-04-13
    相关资源
    最近更新 更多