Pandas如何按指定列唯一值提取对应review_id生成列表新列
实现Pandas按列值聚合关联ID为列表的方案
需求背景
现有DataFrame样例数据结构如下:
review_id ngram date rating attraction indo 4 bigram 2021 10 uss sangat lengkap 359 bigram 2019 10 uss sangat lengkap 911 bigram 2018 10 uss sangat lengkap 977 bigram 2018 10 uss sangat lengkap 1062 bigram 2019 10 uss agak bingung 2919 bigram 2019 9 uss agak bingung 3531 bigram 2018 10 uss sangat lengkap 4282 bigram 2019 10 sea_aquarium sangat lengkap
需要实现:针对indo列的每个唯一取值,将其关联的所有review_id聚合为列表,匹配到原表所有对应indo值的行上。
原有代码问题
你之前写的代码存在两处核心逻辑错误:
- 直接将
value_counts()返回的Series赋值给新列时,没有做索引对齐,会出现计数错配、空值问题 - 自定义的
get_all_review_id函数没有接收传入的indo参数,遍历全表时没有做分组匹配,最终返回的是全局满足计数条件的ID集合,和当前行的indo取值完全无关
正确实现代码
方案1:保留原表所有行,每行附上对应indo值的全量review_id列表
用pandas原生groupby+transform实现,无需手写循环,性能更高逻辑更简洁:
# 按indo分组,将每个分组的review_id转为列表后映射回原表每一行 df_sentiment["all_review_id"] = df_sentiment.groupby("indo")["review_id"].transform(lambda x: x.tolist()) # 如果需要同时统计每个indo值的出现次数,可追加以下代码 df_sentiment["count"] = df_sentiment.groupby("indo")["review_id"].transform("count")
运行后效果:
indo值为sangat lengkap的所有行,all_review_id列值均为[4, 359, 911, 977, 3531, 4282]indo值为agak bingung的所有行,all_review_id列值均为[1062, 2919]
方案2:仅输出去重后的indo值与对应ID列表
如果不需要保留原表全部行,只需要每个唯一indo值对应一条聚合结果,直接用groupby聚合即可:
agg_result = df_sentiment.groupby("indo", as_index=False)["review_id"]\ .agg(all_review_id=list, count="count")
返回结果包含3列:indo(唯一值)、all_review_id(对应ID列表)、count(对应出现次数)。
内容的提问来源于stack exchange,提问作者odebear
相关产品推荐
相关产品推荐

