加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Python > 正文

python – 按groupby对中的最大元素过滤数据帧

发布时间:2020-12-20 13:19:07 所属栏目:Python 来源:网络整理
导读:我有一个四列的数据框 df=DataFrame({'order_id':[134,101,131,159,189,120,102,134,130,231,421,141,129,101], 'user_id':[24,10,24,12,21,17,12],'product_id':[1004,1041,1078,1001,1074,1019,1021,1004,1010,1017,1004],'sector':['a','a','b','d','c',
我有一个四列的数据框

df=DataFrame({'order_id':[134,101,131,159,189,120,102,134,130,231,421,141,129,101],
          'user_id':[24,10,24,12,21,17,12],'product_id':[1004,1041,1078,1001,1074,1019,1021,1004,1010,1017,1004],'sector':['a','a','b','d','c','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)
具有比与(product_id,user_id)对关联的最大order_id更大的order_id值的对

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

df2=DataFrame({'order_id':[421,131],'product_id':[1010,1078],'sector':['c','b'],'user_id':[10,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

解决方法

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

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读