按分组提取DataFrame中的字段差异
问题描述
现有如下结构的DataFrame:
| ID | col1 | col2 |
|---|---|---|
| AB | 1 | 3 |
| AB | 1 | 3 |
| CD | 2 | 4 |
| CD | 2 | 3 |
需要按ID分组,比较组内每行数据:
- 若组内某列的所有值都相同,则对应行的
mismatch_extract_该列名字段填Na - 若组内某列存在不同值,则对应行的
mismatch_extract_该列名字段填入该列所有唯一值用冒号连接的字符串(如示例中CD组的col2,值为4和3,所以填4:3)
最终输出格式如下:
| ID | col1 | col2 | mismatch_extract_col1 | mismatch_extract_col2 |
|---|---|---|---|---|
| AB | 1 | 3 | Na | Na |
| AB | 1 | 3 | Na | Na |
| CD | 2 | 4 | Na | 4:3 |
| CD | 2 | 3 | Na | 4:3 |
解决方案
可以使用Pandas的分组功能结合自定义函数实现,代码如下:
import pandas as pd # 构建示例DataFrame df = pd.DataFrame({ 'ID': ['AB', 'AB', 'CD', 'CD'], 'col1': [1, 1, 2, 2], 'col2': [3, 3, 4, 3] }) def process_group(group): # 遍历每个数据列,生成差异提取字段 for col in ['col1', 'col2']: unique_vals = group[col].unique() if len(unique_vals) > 1: # 把唯一值转成字符串并用冒号连接 extract_val = ':'.join(map(str, unique_vals)) else: extract_val = 'Na' # 添加到分组中 group[f'mismatch_extract_{col}'] = extract_val return group # 按ID分组并应用处理函数 result_df = df.groupby('ID', group_keys=False).apply(process_group) print(result_df)
代码说明:
groupby('ID', group_keys=False):按ID分组,避免分组键作为索引添加到结果中- 自定义函数
process_group:对每个分组的每一列,检查唯一值数量:- 唯一值数量大于1时,将所有唯一值转为字符串并用冒号连接
- 唯一值数量等于1时,赋值为
Na
- 最后将生成的差异提取列添加到原分组数据中,合并得到最终结果
内容的提问来源于stack exchange,提问作者simon brocard
相关产品推荐
相关产品推荐

