无需数值聚合的Pandas分组操作:获取指定列的唯一组合
更简洁实现Pandas中类似SQL
SELECT DISTINCT的方法 嘿,你完全不用通过聚合再删列这种绕路的方式!Pandas里有好几种直接实现你需求的方法,完美对应SQL里的SELECT DISTINCT day, distinct_id逻辑:
方法1:用drop_duplicates()(最直观推荐)
这是最直接的方式,专门用来保留指定列的唯一组合,代码简洁明了:
import pandas as pd df = pd.DataFrame(data = { 'day': ['2020-10-01', '2020-10-01', '2020-10-01', '2020-10-01', '2020-10-01', '2020-10-01', '2020-10-02', '2020-10-02', '2020-10-02', '2020-10-02', '2020-10-02'], 'distinct_id': ['a', 'a', 'a', 'b', 'b', 'c', 'a', 'a', 'b', 'c', 'c'], 'value': [71, 72, 73, 74, 74, 73, 72, 71, 71, 72, 73] }) # 只保留day和distinct_id的唯一组合,重置索引 result = df[['day', 'distinct_id']].drop_duplicates().reset_index(drop=True) print(result)
运行后就会得到你想要的输出:
day distinct_id 0 2020-10-01 a 1 2020-10-01 b 2 2020-10-01 c 3 2020-10-02 a 4 2020-10-02 b 5 2020-10-02 c
方法2:用groupby配合head(1)
如果你已经习惯用groupby的思路,也可以直接取每个分组的第一行,不用做聚合:
result = df.groupby(['day', 'distinct_id']).head(1).reset_index(drop=True)[['day', 'distinct_id']]
这个逻辑是先按day和distinct_id分组,然后每个组只保留第一行,最后筛选出需要的两列。
方法3:用pd.DataFrame.drop_duplicates()的另一种写法
如果你不想先筛选列,也可以直接在整个DataFrame上指定subset参数,然后再提取需要的列:
result = df.drop_duplicates(subset=['day', 'distinct_id'])[['day', 'distinct_id']].reset_index(drop=True)
这种写法和方法1效果一致,只是顺序不同,看你个人习惯选择。
对比你之前的临时方案,这些方法都不需要处理冗余列的删除操作,直接一步到位得到目标结果,代码更简洁也更易维护~
内容的提问来源于stack exchange,提问作者le_crease
相关产品推荐
相关产品推荐

