基于Pandas统计DataFrame列值关联单/多值规则的方法问询
高效解决Pandas分组关联规则统计问题
嘿,我来帮你用Pandas搞定这个分组统计的需求!这种按列c分组,统计不同维度关联规则的场景,用Pandas的分组聚合就能轻松实现,完全不用手动循环一个个处理,对大型DataFrame来说效率拉满。
先处理原始示例需求
首先咱们先定义原始的示例DataFrame:
import pandas as pd df_original = pd.DataFrame({ 'c': ['x', 'x', 'y', 'y', 'z', 'z'], 's': ['a1', 'a1', 'a1', 'a1', 'a1', 'a2'], 't': [1, 1, 1, 2, 1, 1] })
核心思路
对c列分组后,聚合计算每个分组中s和t的唯一值数量,咱们就能根据这两个计数来判断每个c值属于哪一类规则。
先执行分组聚合:
group_stats = df_original.groupby('c').agg( unique_s_count=('s', 'nunique'), # 每个c分组下s的唯一值数量 unique_t_count=('t', 'nunique'), # 每个c分组下t的唯一值数量 count=('c', 'size') # 每个c分组的行数(后续补充需求用) ).reset_index()
对应三个需求的结果提取
- 仅与列s和t的单个值关联
req1 = set(group_stats[(group_stats['unique_s_count'] == 1) & (group_stats['unique_t_count'] == 1)]['c']) print(f"需求1结果:{req1},数量{len(req1)}") # 输出:需求1结果:{'x'},数量1
- 仅与列s的单个值关联,但与列t的多个值关联
req2 = set(group_stats[(group_stats['unique_s_count'] == 1) & (group_stats['unique_t_count'] > 1)]['c']) print(f"需求2结果:{req2},数量{len(req2)}") # 输出:需求2结果:{'y'},数量1
- 与列s的多个值关联(列t值数量不限)
req3 = set(group_stats[group_stats['unique_s_count'] > 1]['c']) print(f"需求3结果:{req3},数量{len(req3)}") # 输出:需求3结果:{'z'},数量1
处理补充需求(修订后的DataFrame)
接下来咱们处理补充的第四个需求,先定义修订后的DataFrame:
df = pd.DataFrame({ 'c': ['x', 'x', 'y', 'y', 'z', 'z', 'z1', 'z1', 'z2'], 's': ['a1', 'a1', 'a1', 'a1', 'a1', 'a2', 'a3', 'a3', 'a4'], 't': [1, 1, 1, 2, 1, 1, 3, 3, 1], 'cat': ['a', 'a', 'a', 'a', 'a', 'a', 'a', 'b', 'a'] })
需求4:出现次数≥2,仅与列s和t的单个值关联且cat为'a'
这里要注意:我们需要确保分组内的行要么全是cat='a'(或者仅考虑cat='a'的行),结合示例结果,咱们用两种方式实现都可以,结果一致:
方式一:先过滤cat='a'的行再统计
filtered_df = df[df['cat'] == 'a'] group_stats_supplement = filtered_df.groupby('c').agg( unique_s_count=('s', 'nunique'), unique_t_count=('t', 'nunique'), count=('c', 'size') ).reset_index() req4 = set(group_stats_supplement[(group_stats_supplement['count'] >= 2) & (group_stats_supplement['unique_s_count'] == 1) & (group_stats_supplement['unique_t_count'] == 1)]['c']) print(f"需求4结果:{req4},数量{len(req4)}") # 输出:需求4结果:{'x'},数量1
方式二:确保分组内所有行cat都是'a'
如果需要严格保证分组内每一行的cat都是'a',可以在聚合时增加一个判断:
group_stats_supplement2 = df.groupby('c').agg( unique_s_count=('s', 'nunique'), unique_t_count=('t', 'nunique'), count=('c', 'size'), all_cat_a=('cat', lambda x: (x == 'a').all()) # 判断分组内所有cat是否都是a ).reset_index() req4_2 = set(group_stats_supplement2[(group_stats_supplement2['count'] >= 2) & (group_stats_supplement2['unique_s_count'] == 1) & (group_stats_supplement2['unique_t_count'] == 1) & (group_stats_supplement2['all_cat_a'])]['c']) print(f"需求4结果:{req4_2},数量{len(req4_2)}") # 输出同样是:需求4结果:{'x'},数量1
这种方法的好处是完全利用Pandas的向量化聚合操作,比手动遍历分组快得多,处理大型DataFrame时优势特别明显,代码也简洁易维护。
内容的提问来源于stack exchange,提问作者Bede Constantinides
相关产品推荐
相关产品推荐

