在 groupby pandas 中获取以字典格式存储的值频率的最快方法
fastest way to get value frequency stored in dictionary format in groupby pandas
为了通过 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-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
我不建议以这种格式存储数据,对象通常使用起来比较麻烦。
如果拆栈生成 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
为了通过 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-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
我不建议以这种格式存储数据,对象通常使用起来比较麻烦。
如果拆栈生成 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