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

基于Pandas的行相似数据压缩:合并同A值行并处理独热编码结果

解决方案:按A列分组合并独热编码行

我完全理解你的需求——你希望把原始数据中A列值相同的行合并成一行,并且对应独热编码后的B类列,只要该分组里出现过这个类别就标记为1,否则为0。下面是具体的实现代码和步骤说明:

步骤1:准备原始数据

首先我们先还原你的数据集:

import pandas as pd

# 构建原始DataFrame
df = pd.DataFrame({
    'A': [1, 1, 1, 2, 2, 3],
    'B': ['k', 'g', 'e', 'g', 'e', 'd']
})

步骤2:执行独热编码

用pd.get_dummies()对B列进行独热编码,同时保留A列:

# 对B列做独热编码
encoded_df = pd.get_dummies(df, columns=['B'])

此时encoded_df的结构就是你提到的逐行独热编码形式:

A  B_k  B_g  B_e  B_d
0  1    1    0    0    0
1  1    0    1    0    0
2  1    0    0    1    0
3  2    0    1    0    0
4  2    0    0    1    0
5  3    0    0    0    1

步骤3:分组合并并处理独热列

核心操作是按A列分组,对所有B开头的独热列取最大值(因为只要分组内有一行是1,最大值就为1,正好对应“该分组存在此类别”的逻辑):

# 按A分组,取各独热列的最大值,然后重置索引
result_df = encoded_df.groupby('A').max().reset_index()

最终结果

此时你会得到想要的合并后数据:

A  B_k  B_g  B_e  B_d
0  1    1    1    1    0
1  2    0    1    1    0
2  3    0    0    0    1

如果只需要你示例中的A、B_k、B_g、B_e列,可以再筛选一下:

result_df = result_df[['A', 'B_k', 'B_g', 'B_e']]

输出就完全匹配你的示例了:

A  B_k  B_g  B_e
0  1    1    1    1
1  2    0    1    1

补充说明

  • 用max()而不是sum()的原因:独热编码的取值只有0和1,max()能直接标记“是否存在该类别”,而sum()会得到该类别出现的次数,不符合你的需求。
  • 如果你的数据量很大,这种方法效率也很高,因为groupby().max()是Pandas的高效聚合操作。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 06:34:10