df.groupby一列,计数另一列中的值

时间:2019-01-23 21:48:51

标签: python pandas

我有一个这种格式的数据框(多行,col2中有数百个不同的值):

dftest = pd.DataFrame(
    {'col1': ['black', 'black', 'brown', 'black', 'green', 'red', 'black', 'black'],
     'col2': ['cat', 'cat', 'dog', 'dog', 'snake', 'snake', 'bird', 'bird']})

我知道我可以将col2中的所有动物条目与

一起分组
grouped = dftest.groupby('col2')

我想使用grouped df对col1中的颜色组合进行计数,并按col2中的值进行分组。

例如,catbird分组在black/black中都有col1,因此black/black = 2也是如此。只有蛇有red/green,所以red/green = 1。所需的输出:

black/black = 2
black/brown = 1
green/red = 1

1 个答案:

答案 0 :(得分:1)

您按'col2'分组,然后使用'/'.join(sorted(x))获得可能的颜色组合。 '/'.join(sorted(x))将把所有值放在一个组中,并将它们连接在一起成为一个字符串。因此,如果'black''white'在一个组中,它将把它们连接在一起成为字符串'black/white'。另外,我对值进行排序,这样就不可能将'black/white'放在一个组中,而将'white/black'放在另一个组中。此lambda函数适用于每个组。然后使用Counter将计数存储在字典中。

from collections import Counter

Counter(dftest.groupby('col2')['col1'].apply(lambda x: '/'.join(sorted(x))))

输出:

{'black/black': 2, 'black/brown': 1, 'green/red': 1}

或者,您可以使用value_counts而不是Counter。它将输出一系列:

dftest.groupby('col2')['col1'].apply(lambda x: '/'.join(sorted(x))).value_counts()

输出:

black/black    2
green/red      1
black/brown    1