【发布时间】:2016-10-07 17:34:57
【问题描述】:
假设我有一个数据框 df,它有 2 列,一个 USER_ID 和一个他们购买的 PRODUCT。
df
USER_ID | PRODUCT
1 a
1 b
1 c
2 d
2 a
2 k
我想将此 DataFrame 转换为新的 df2,其中每一行是一个用户,并且产品被聚合成一个字符串列表。
df2
USER_ID | PRODUCT
1 [a,b,c]
2 [d,a,k]
最后,我希望能够找到两个用户的 PRODUCT 列表之间的交集。
我能够创建第二个数据框,但我使用的方法导致列表无法迭代。
具体来说,我会: df2 = df1.groupby('USER_ID)['PRODUCT'].agg(lambda x: x.tolist())
这给了我一个我转换回数据框的系列。
df2 = df2.to_frame()
这给了我正在寻找的 df2,但每个产品列表的长度 = 1,因此我无法将 1 与另一个进行比较以找到产品的交集。例如,当我执行时:
s1 = df2.PRODUCT[df2.USER_ID == 1]
s2 = df2.PRODUCT[df2.USER_ID == 2]
common_elements = list(set(s1).intersection(set(s2)))
common_elements
结果是一个空列表而不是 [a]。我究竟做错了什么?
【问题讨论】:
-
要更直接地回答您的问题“我做错了什么?”,我很难说,因为当我按照您在上面编写的确切代码时,生成的
df2不会有一个专栏PRODUCT。你遗漏了一些代码吗? -
@James 使用 pandas 交叉表...见下文。
标签: python list pandas intersection iterable