我有一个这种格式的数据框(多行,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
中的值进行分组。
例如,cat
和bird
分组在black/black
中都有col1
,因此black/black = 2
也是如此。只有蛇有red/green
,所以red/green = 1
。所需的输出:
black/black = 2
black/brown = 1
green/red = 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