我有一个四列的数据框
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
答案 0 :(得分:0)
我不确定这是否是最有效的解决方案,但它确实有效:
{{1}}