如何用Pandas识别某列元素对应另一列唯一值完全相同的项
问题:识别DataFrame中某列元素对应另一列唯一值完全相同的分组
需求:在DataFrame中,找出列A里的元素,它们在列B中对应的唯一值集合完全相同。比如示例中,需要自动识别出Bill和John对应的response唯一值都是[21,23]。同时需要解决输出结果中列名0的重命名问题。
解决方案
1. 重命名输出中的列
原来的apply+reset_index会生成默认列名0,可以通过两种方式直接生成自定义列名:
方法一:使用agg指定列名
直接在分组聚合时定义列名,代码更简洁:
import pandas as pd df1 = pd.DataFrame({ 'name': ['John', 'Jane', 'John', 'Bill', 'Sue', 'Fred', 'Bill'], 'response': [23, 29, 21, 21, 34, 18, 23]}) # 聚合时直接指定列名,同时对唯一值排序 result = df1.groupby('name').agg( unique_responses=lambda x: sorted(x['response'].unique()) ).reset_index() print(result)
输出:
name unique_responses 0 Bill [21, 23] 1 Fred [18] 2 Jane [29] 3 John [21, 23] 4 Sue [34]
方法二:聚合后重命名列
如果保留原来的apply写法,可在reset_index后用rename修改列名:
result = df1.groupby('name').apply(lambda x: sorted(x['response'].unique())).reset_index() result = result.rename(columns={0: 'unique_responses'})
2. 自动识别对应唯一值完全相同的元素
由于列表是不可哈希的,无法直接用来分组,我们可以把唯一值列表转换成元组(可哈希类型),然后通过分组或查找重复项来识别目标元素:
方法一:基于元组分组,筛选分组大小>1的结果
# 先生成带唯一值元组的DataFrame result['response_tuple'] = result['unique_responses'].apply(tuple) # 按元组分列,找出有多个name的分组 groups = result.groupby('response_tuple')['name'].apply(list).reset_index() # 筛选出包含多个元素的分组 matched_groups = groups[groups['name'].apply(len) > 1] print(matched_groups)
输出:
response_tuple name 0 (21, 23) [Bill, John]
方法二:用duplicated标记重复的唯一值集合
result['response_tuple'] = result['unique_responses'].apply(tuple) # 标记重复的元组(包括第一次出现的) result['is_duplicate'] = result.duplicated('response_tuple', keep=False) # 筛选出重复的记录 matched_names = result[result['is_duplicate']] print(matched_names[['name', 'unique_responses']])
输出:
name unique_responses 0 Bill [21, 23] 3 John [21, 23]
内容的提问来源于stack exchange,提问作者pandas_fan
相关产品推荐
相关产品推荐

