如何在Pandas DataFrame中高效聚合One-Hot编码多行数据为单行?
解决Pandas中按组聚合One-Hot编码列的问题
你的需求核心是按p列分组,将每个分组内的One-Hot编码列(c1/c2/c3)合并,只要该分组内某列出现过1,结果就保留1,本质是提取分组内各列的“存在性标记”。这里有两种高效的实现方式:
方法一:使用groupby().max()
因为你的One-Hot列只有0和1,取分组内的最大值就能直接得到“是否出现过1”的结果,代码非常简洁:
import pandas as pd # 构造你的示例数据 df = pd.DataFrame({ 'p': ['A', 'B', 'A', 'A', 'B'], 'c1': [1, 1, 0, 0, 0], 'c2': [0, 0, 1, 0, 0], 'c3': [0, 0, 0, 1, 1] }) # 按p分组,取各列最大值,然后重置索引恢复p列为普通列 result = df.groupby('p').max().reset_index() print(result)
运行后会得到你想要的输出:
p c1 c2 c3 0 A 1 1 1 1 B 1 0 1
方法二:使用groupby().any().astype(int)
另一种思路是判断分组内某列是否存在非零值(即1),any()会返回布尔值(True/False),再转成整数就是1/0,效果完全一致:
result = df.groupby('p').any().astype(int).reset_index()
为什么这两种方法高效?
这两种都是pandas内置的向量化聚合操作,避免了循环遍历行的低效方式,即使处理十万甚至百万级别的数据,也能保持很好的性能。
内容的提问来源于stack exchange,提问作者Khaned
相关产品推荐
相关产品推荐

