熊猫:来自 groupby.value_counts() 的字典

Posted

技术标签:

【中文标题】熊猫:来自 groupby.value_counts() 的字典【英文标题】:pandas: Dict from groupby.value_counts() 【发布时间】:2017-12-20 01:20:54 【问题描述】:

我有一个 pandas 数据框 df,其中包含 userproduct 列。它描述了哪个用户购买了哪些产品,说明了对同一产品的重复购买。例如。如果用户 1 购买了产品 23 3 次,df 将包含用户 1 的 3 次条目 23。 对于每个用户,我只对该用户购买超过 3 次的产品感兴趣。因此,我做s = df.groupby('user').product.value_counts(),然后过滤s = s[s>2],丢弃不经常购买的产品。然后,s 看起来像这样:

user     product
3        39190         9
         47766         8
         21903         8
6        21903         5
         38293         5
11       8309          7
         27959         7
         14947         5
         35948         4
         8670          4

过滤数据后,我不再对频率(右列)感兴趣。

如何根据s 创建user:product 形式的字典?我无法访问系列的各个列/索引。

【问题讨论】:

【参考方案1】:

选项 0

s.reset_index().groupby('user').product.apply(list).to_dict()

3: [39190, 47766, 21903],
 6: [21903, 38293],
 11: [8309, 27959, 14947, 35948, 8670]

选项 1

s.groupby(level='user').apply(lambda x: x.loc[x.name].index.tolist()).to_dict()

3: [39190, 47766, 21903],
 6: [21903, 38293],
 11: [8309, 27959, 14947, 35948, 8670]

选项 2

from collections import defaultdict

d = defaultdict(list)

[d[x].append(y) for x, y in s.index.values];

dict(d)

3: [39190, 47766, 21903],
 6: [21903, 38293],
 11: [8309, 27959, 14947, 35948, 8670]

【讨论】:

谢谢,解决了!在选项 0 中,我必须在 reset_index() 中提供一个新列名,否则会出现命名错误(与 here 中描述的相同)。

以上是关于熊猫:来自 groupby.value_counts() 的字典的主要内容,如果未能解决你的问题,请参考以下文章

python 来自csv的大熊猫

熊猫:来自没有合并的匹配的列

来自按级别分组的多索引熊猫数据框的子图

Spark中来自pyspark的熊猫[重复]

来自另一个数据框的熊猫多索引分配

来自熊猫数据框的自定义 JSON 格式输出