我有以下 Dataframe :
df = pd.DataFrame([
(1, 1, 'term1'),
(1, 2, 'term2'),
(1, 1, 'term1'),
(1, 1, 'term2'),
(2, 2, 'term3'),
(2, 3, 'term1'),
(2, 2, 'term1')
], columns=['id', 'group', 'term'])
我想把它按id
和group
分组,然后计算这个id,group对中每个项的个数。
所以最后我会得到这样的结果:
我可以用df.iterrows()
遍历所有行并创建一个新的 Dataframe 来实现我想要的,但这显然效率低下(如果有用的话,我事先知道所有术语的列表,总共有大约10个)。
看起来我必须先分组,然后再计数值,所以我用df.groupby(['id', 'group']).value_counts()
尝试了一下,但没有成功,因为value_counts操作的是groupby系列,而不是 Dataframe 。
不管怎样,我可以不用循环就实现这个吗?
6条答案
按热度按时间pes8fvy91#
我使用
groupby
和size
时间
1,000,000行
63lcw9qa2#
使用pivot_table()方法:
700K行DF的时序:
7M行DF的时序:
clj7thdc3#
不要去记住冗长的解决方案,来听听Pandas为你准备的一个吧:
ovfsdjhp4#
您可以使用
crosstab
:groupby
的另一个解决方案,聚合size
,按unstack
整形:1tu0hz3e5#
如果你想使用
value_counts
,你可以在一个给定的系列上使用它,并采取以下措施:或者以等效的方式,使用
.agg
方法:另一种选择是直接在DataFrame本身上使用
value_counts
,而不采用groupby
:9njqaruj6#
另一种选择: