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

