获取以大熊猫格式存储在字典格式中的值频率的最快方法

问题描述 投票:1回答:2

为了通过id计算每个值的频率,我们可以使用value_counts和groupby进行操作。

>>> df = pd.DataFrame({"id":[1,1,1,2,2,2], "col":['a','a','b','a','b','b']})
>>> df
   id col
0   1   a
1   1   a
2   1   b
3   2   a
4   2   b
5   2   b
>>> df.groupby('id')['col'].value_counts()
id  col
1   a      2
    b      1
2   b      2
    a      1

但是我想以字典格式而不是系列格式存储结果。那么,如果我们拥有大型数据集,我如何能够实现这一目标,并且速度也很快?理想的格式是:

id
1    {'a': 2, 'b': 1}
2    {'a': 1, 'b': 2}
pandas group-by frequency
2个回答
1
投票

您可以拆开groupby结果以获得一个dict-of-dicts:

df.groupby('id')['col'].value_counts().unstack().to_dict(orient='index')
# {1: {'a': 2, 'b': 1}, 2: {'a': 1, 'b': 2}}

如果要一系列字典,请使用agg代替to_dict

df.groupby('id')['col'].value_counts().unstack().agg(pd.Series.to_dict)

col
a    {1: 2, 2: 1}
b    {1: 1, 2: 2}
dtype: object

我不建议以这种格式存储数据,使用对象通常比较麻烦。


0
投票

我们可以做pd.crosstab

pd.Series(pd.crosstab(df.id,df.col).to_dict('i'))
1    {'a': 2, 'b': 1}
2    {'a': 1, 'b': 2}
dtype: object
© www.soinside.com 2019 - 2024. All rights reserved.