![](/img/trans.png)
[英]Pandas: create a conditional column and return a value based on the values of 2 columns in another df.groupby
[英]df.groupby one column, count values in another column
我有一个这种格式的数据框(具有更多的行, 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
分组在col1
都具有black/black
,因此black/black = 2
。 只有蛇具有red/green
,因此red/green = 1
。 所需的输出:
black/black = 2
black/brown = 1
green/red = 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
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.