You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于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()

对应三个需求的结果提取

  1. 仅与列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
  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
  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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.06 17:08:11