Pandas DataFrame连续行比较:生成指定标识矩阵
使用Pandas比较连续行生成符合规则的矩阵
问题说明
需要根据以下规则生成矩阵:
- 若连续两行完全相同,矩阵对应列设为1,其余列设为0;
- 若连续两行不完全相同,则切换到新的列,重复上述规则。
现有代码错误地使用了「所有列都不同」作为分组条件,导致部分不完全相同的行被归为同一组,无法得到期望输出。
修正后的代码
import pandas as pd import numpy as np d = { 'col1': ['French', 'French', 'Japanese', 'Chinese', 'Chinese', 'English', 'French', 'Hindi', 'Bengali'], 'col2': ['France', 'France', 'Japan', 'China', 'China', 'Canada', 'Canada', 'India', 'India'], 'col3': [0.30, 0.30, 0.25, 0.21, 0.21, 0.37, 0.15, 0.40, 0.27] } df = pd.DataFrame(data=d) # 修正分组逻辑:只要整行与上一行存在不同(任意一列不同),就开启新组 group = df.ne(df.shift()).any(1).cumsum().sub(1) # 生成包含额外2列的矩阵 Jac = np.zeros((len(df), group.max() + 3), dtype=int) Jac[np.arange(len(df)), group] = 1 print(Jac)
输出结果
[[1 0 0 0 0 0 0 0 0] [1 0 0 0 0 0 0 0 0] [0 1 0 0 0 0 0 0 0] [0 0 1 0 0 0 0 0 0] [0 0 1 0 0 0 0 0 0] [0 0 0 1 0 0 0 0 0] [0 0 0 0 1 0 0 0 0] [0 0 0 0 0 1 0 0 0] [0 0 0 0 0 0 1 0 0]]
关键修正点
原代码中df.ne(df.shift()).all(1)的逻辑是「所有列都与上一行不同才开启新组」,这不符合需求。我们需要的是「整行不完全相同就开启新组」,因此替换为:
df.ne(df.shift()).any(1):逐行比较当前行与上一行,只要任意一列值不同,就返回True,触发新组切换。- 后续的
cumsum().sub(1)将布尔值累加转换为从0开始的分组索引,确保每个不同的行组对应唯一列。
内容的提问来源于stack exchange,提问作者resunga
相关产品推荐
相关产品推荐

