如何按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
逻辑说明
- 首先获取
B列的所有唯一取值,确定全量的候选值范围; - 对
A列的每个分组,提取该分组已有的B值; - 通过列表推导筛选出当前分组未包含的
B值; - 将结果转换为DataFrame格式,按需合并或单独存储。
内容的提问来源于stack exchange,提问作者nivedan gowda
相关产品推荐
相关产品推荐

