熊猫计算唯一行

问题描述 投票:0回答:3

我有一个类似于以下内容的 pandas 数据框:

ColA ColB
1    1
1    1
1    1
1    2
1    2
2    1
3    2

我想要一个与计数器具有相同功能的输出。 我需要知道每行出现多少次(所有列都相同。

在这种情况下,正确的输出是:

ColA ColB Count
1    1    3
1    2    2
2    1    1
3    2    1

我尝试过类似的事情:

df.groupby(['ColA','ColB']).ColA.count()

但这给了我一些丑陋的输出,我在格式化时遇到问题

python python-2.7 pandas counter
3个回答
30
投票

您可以将

size
reset_index
一起使用:

print df.groupby(['ColA','ColB']).size().reset_index(name='Count')
   ColA  ColB  Count
0     1     1      3
1     1     2      2
2     2     1      1
3     3     2      1

21
投票

我只需要计算计算唯一行并使用了

DataFrame.drop_duplicates
替代方案,如下所示:

len(df[['ColA', 'ColB']].drop_duplicates())

我的数据速度是

len(df.groupby(['ColA', 'ColB']))
的两倍。


5
投票

自 Pandas 1.1.0 起,方法

pandas.DataFrame.value_counts
可用,它完全可以满足您的需求。它创建一个系列,其中唯一行作为多索引,计数作为值:

df = pd.DataFrame({'ColA': [1, 1, 1, 1, 1, 2, 3], 'ColB': [1, 1, 1, 2, 2, 1, 2]})
pd.options.display.multi_sparse = False  # option to print as requested

print(df.value_counts())                 # requires pandas >= 1.1.0

输出(系列),其中

ColA
ColB
是多索引,第三列包含数据(计数):

ColA  ColB
1     1       3
1     2       2
3     2       1
2     1       1
Name: count, dtype: int64

pandas.Series.reset_index
链接,您将获得您请求的 DataFrame:

print(df.value_counts().reset_index())   # requires pandas >= 1.1.0

输出(数据帧):

   ColA  ColB  count
0     1     1      3
1     1     2      2
2     2     1      1
3     3     2      1
© www.soinside.com 2019 - 2024. All rights reserved.