如何解决如何计算熊猫数据框中子组内项目的配对出现?
import pandas as pd
data = {'group': ['a','a','b','c','c'],'item': ['Apple','Chocolate','Beans','Apple','Banana','Orange','Apple' ]
}
df = pd.DataFrame(data,columns = ['group','item'])
df
0 a Apple
1 a Chocolate
2 a Beans
3 a Apple
4 b Beans
5 b Banana
6 b Banana
7 c Chocolate
8 c Banana
9 c Orange
10 c Apple
11 c Apple
如何计算组内配对出现的总数?
我想得到一个表格,其中包含组中出现的每个项目组合并获取它们的频率。如果一组下有两个相同的项目,我想保持项目与自身的组合,但只在与其他项目匹配时才算一个。
理想情况下,我想获得一个在轴、行和列上都有项目名称的数据框,并且有一半的矩阵具有相应的值。
在一列中组合并在另一列上有值的数据框也可以完美地工作。
上面的例子将转化为:
apple - chocolate 2
apple - apple 2
apple - beans 1
apple - Orange 1
apple - Banana 1
chocolate - Beans 1
beans - banana 1
banana - banana 1
chocolate - banana 1
chocolate - orange 1
banana - orange 1
所以我想我会首先使用没有重复的组合和计数器,然后再添加与自己匹配的项目。原因是为了避免为同一组下的多个项目组合计算多个匹配项。但是,当我尝试这样做时,某些组合以不同的顺序出现两次,例如苹果 - 巧克力和巧克力 - 苹果。这是我的代码:
from collections import Counter
from itertools import combinations
df = df.groupby('group').filter(lambda g: len(g) > 1).drop_duplicates(subset=['group','item'],keep="first")
result = df.groupby(['group']).agg(lambda g: list(set(combinations(g,2))))
combos = pd.DataFrame(Counter(result.item.sum()).items(),columns=['combos','count'])
combos
combos count
0 (Apple,Beans) 1
1 (Apple,Chocolate) 1
2 (Chocolate,Beans) 1
3 (Beans,Banana) 1
4 (Chocolate,Orange) 1
5 (Orange,Apple) 1
6 (Banana,Orange) 1
7 (Banana,Apple) 1
8 (Chocolate,Banana) 1
9 (Chocolate,Apple) 1
请帮帮我!
解决方法
对您的代码稍作调整即可解决您的问题
## No need to drop to duplicates as you create a set of the combinations,so they won't be counted twice
# df = df.groupby('group').filter(lambda g: len(g) > 1).drop_duplicates(subset=['group','item'],keep="first")
## Sorted g,so the problem with tuples that are ordered differently is solved
result = df.groupby(['group']).agg(lambda g: list(set(combinations(sorted(g),2))))
combos = pd.DataFrame(Counter(result.item.sum()).items(),columns=['combos','count'])
combos
combos count
0 (Apple,Beans) 1
1 (Beans,Chocolate) 1
2 (Apple,Apple) 2
3 (Apple,Chocolate) 2
4 (Banana,Banana) 1
5 (Banana,Beans) 1
6 (Apple,Banana) 1
7 (Banana,Orange) 1
8 (Apple,Orange) 1
9 (Chocolate,Orange) 1
10 (Banana,Chocolate) 1
用 ##
您当然可以使用
轻松地对结果后记进行排序combos.sort_values('count',ascending=False)
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。