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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.24 15:27:49