按来自groupby

时间:2017-08-06 19:21:58

标签: python pandas

我有一个四列的数据框

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' s 与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

1 个答案:

答案 0 :(得分:0)

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

{{1}}