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

如何按DataFrame列分组并提取各组未包含的取值

获取DataFrame分组中未包含的所有取值

这里有两种方法可以实现你的需求,一种是生成合并后的new_df,另一种是为每个分组创建独立的DataFrame,具体代码和解释如下:

方法一:生成合并后的new_df

先构造你的原始DataFrame,再通过分组计算每个组缺失的B列取值,最后合并结果:

import pandas as pd

# 构造原始DataFrame
df = pd.DataFrame({
    'A': [1, 1, 1, 2, 3],
    'B': ['a', 'a', 'b', 'c', 'd']
})

# 获取B列的所有唯一取值
all_b_values = df['B'].unique()

# 遍历每个分组,生成缺失值数据
missing_data = []
for group_id, group_data in df.groupby('A'):
    # 当前分组已有的B值
    present_b = group_data['B'].unique()
    # 计算当前分组未包含的B值
    missing_b = [val for val in all_b_values if val not in present_b]
    # 将结果添加到列表中
    missing_data.extend([(group_id, val) for val in missing_b])

# 转换为目标DataFrame
new_df = pd.DataFrame(missing_data, columns=['item', 'val_not_present'])
print(new_df)

运行后输出的new_df就是你需要的结果:

item val_not_present
0     1                c
1     1                d
2     2                a
3     2                b
4     2                d
5     3                a
6     3                b
7     3                c

方法二:为每个分组生成独立的DataFrame

如果你需要为每个分组单独创建DataFrame(比如df1、df2、df3),可以用字典来存储这些分组结果:

import pandas as pd

# 构造原始DataFrame
df = pd.DataFrame({
    'A': [1, 1, 1, 2, 3],
    'B': ['a', 'a', 'b', 'c', 'd']
})

# 获取B列的所有唯一取值
all_b_values = df['B'].unique()

# 用字典存储每个分组的缺失值DataFrame
group_missing_dfs = {}
for group_id, group_data in df.groupby('A'):
    present_b = group_data['B'].unique()
    missing_b = [val for val in all_b_values if val not in present_b]
    # 创建当前分组的DataFrame并存储到字典
    group_missing_dfs[f'df{group_id}'] = pd.DataFrame({
        'val_not_present': missing_b
    })

# 访问单个分组的DataFrame
print("df1:")
print(group_missing_dfs['df1'])
print("\ndf2:")
print(group_missing_dfs['df2'])
print("\ndf3:")
print(group_missing_dfs['df3'])

运行后会输出每个分组的缺失值DataFrame:

df1:
  val_not_present
0                c
1                d

df2:
  val_not_present
0                a
1                b
2                d

df3:
  val_not_present
0                a
1                b
2                c

逻辑说明

  1. 首先获取B列的所有唯一取值,确定全量的候选值范围;
  2. 对A列的每个分组,提取该分组已有的B值;
  3. 通过列表推导筛选出当前分组未包含的B值;
  4. 将结果转换为DataFrame格式,按需合并或单独存储。

内容的提问来源于stack exchange,提问作者nivedan gowda

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.07 21:57:33