Pandas 在groupby中以字典格式存储值频率的最快方法

Pandas 在groupby中以字典格式存储值频率的最快方法,pandas,group-by,frequency,Pandas,Group By,Frequency,为了通过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')[

为了通过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}

您可以取消对groupby结果的堆叠,以获得dict的dict:

df.groupby('id')['col'].value_counts().unstack().to_dict(orient='index')
# {1: {'a': 2, 'b': 1}, 2: {'a': 1, 'b': 2}}
如果需要一系列dict,请使用
agg
而不是
来进行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
我不建议以这种格式存储数据,对象通常更麻烦


如果取消堆叠生成NAN,请尝试使用
GroupBy.agg

df.groupby('id')['col'].agg(lambda x: x.value_counts().to_dict())

id
1    {'a': 2, 'b': 1}
2    {'b': 2, 'a': 1}
Name: col, dtype: object

您可以取消对groupby结果的堆叠,以获得dict的dict:

df.groupby('id')['col'].value_counts().unstack().to_dict(orient='index')
# {1: {'a': 2, 'b': 1}, 2: {'a': 1, 'b': 2}}
如果需要一系列dict,请使用
agg
而不是
来进行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
我不建议以这种格式存储数据,对象通常更麻烦


如果取消堆叠生成NAN,请尝试使用
GroupBy.agg

df.groupby('id')['col'].agg(lambda x: x.value_counts().to_dict())

id
1    {'a': 2, 'b': 1}
2    {'b': 2, 'a': 1}
Name: col, dtype: object

我们可以做
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

我们可以做
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

谢谢你的回答。但是,如果ID没有特定的键,则取消序列堆栈将生成nan值。如果结果中的值为nan,我们如何删除键?@M.Cong-hmm这将很难,因为您需要使用lambda进行应用,这将导致减速。@M.Cong这里有一个替代方法,它不会取消堆栈,因此不会生成nan。也许这对你有用?谢谢你的回答。但是,如果ID没有特定的键,则取消序列堆栈将生成nan值。如果结果中的值为nan,我们如何删除键?@M.Cong-hmm这将很难,因为您需要使用lambda进行应用,这将导致减速。@M.Cong这里有一个替代方法,它不会取消堆栈,因此不会生成nan。也许这对你有用?