You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.30 01:12:45