【发布时间】: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_id1001),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 顺序。这个问题很混乱,我尽力总结了。
-
我还是不明白你的逻辑。您可能需要考虑扩展您的示例。
-
提供了其他示例