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

Pandas行转多列分组问题:get_dummies与聚合结合求助

问题解答

1. 此方法是否正确?

不正确。核心问题出在get_dummies()的分隔符设置上,导致生成了重复列,后续转置聚合的操作无法从根源解决标签重复的问题。

2. 转置后操作哪里出错?

转置后的groupby没解决重复问题,根源是拆分标签时的分隔符错误:你的Tags列用" | "(带空格的竖线)分隔,但str.get_dummies()默认分隔符是单个竖线|,拆分时会把"A"和" A"当成两个不同标签,生成重复列(比如列名A和 A)。转置后index列里的这些重复标签是不同字符串,groupby自然无法合并它们。

3. 正确做法是什么?

有两种高效解决方案,根据Tags列的形式选择:

方案一:针对|分隔的字符串列(当前代码返回的result)

修改get_dummies()的分隔符为" | ",直接生成无重复的标签计数列:

# 用正确分隔符拆分并统计每行标签数量
tag_counts = df["Tags"].str.get_dummies(sep=" | ")
# 和原DataFrame合并
final_df = pd.concat([df["Text"], tag_counts], axis=1)

无需后续转置聚合,直接得到每行各标签的计数结果。

方案二:针对数组形式的Tags列(返回tags而非result)

如果修改getTags()返回数组(即return tags),用explode()+crosstab()的方式更高效,避免字符串拆分的问题:

# 修改getTags函数返回数组
def getTags(serie):
    tokens = word_tokenize(serie)
    tags = pos_tag(tokens)
    tags = [t[1] for t in tags if t[0] not in punctuation]
    return tags  # 返回数组而非拼接后的字符串

df["Tags"] = df["Text"].apply(getTags)

# 拆分数组并统计每行标签计数
exploded_df = df.explode("Tags")
tag_counts = pd.crosstab(exploded_df["Text"], exploded_df["Tags"])
final_df = tag_counts.reset_index().rename_axis(None, axis=1)

这种方法适合处理大量数据,避免字符串操作的额外开销。

补充:清洗已生成的重复列

如果已经用错误分隔符生成了带空格的重复列,可以用以下代码快速合并:

tag_df = df["Tags"].str.get_dummies()
# 去除列名前后空格
tag_df.columns = tag_df.columns.str.strip()
# 合并重复列的计数
tag_df = tag_df.groupby(tag_df.columns, axis=1).sum()
# 和原表合并
final_df = pd.concat([df["Text"], tag_df], axis=1)

内容的提问来源于stack exchange,提问作者Louloumonkey

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 20:55:34