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
相关产品推荐
相关产品推荐

