Pandas字符串比较异常:不同字符串对比始终返回True
问题根源与解决方案
你遇到的问题其实是因为你的对比代码只针对第一行的元素进行了比较,然后把这个单一的布尔结果赋值给了整个comparison列,所以才会出现“明明值不匹配但返回True”的错觉——实际上这个True只是第一行和第二行的对比结果,被广播到了所有行。
问题出在这行代码:
df['comparison'] = df['company'].shift(-1).values[0] == df['company'].values[0]
这里的.values[0]分别提取了shift(-1)后列的第一个元素,以及原company列的第一个元素,对比后得到一个单一的布尔值(比如True),然后Pandas会把这个值填充到comparison列的每一行,所以你看到的所有行都是同一个结果,而不是逐行对比当前行和下一行的值。
正确的逐行对比写法
要实现每一行的company值与正下方行的company值对比,直接对整列进行操作即可,不需要提取单个元素:
# 直接对整列做元素级对比 df['comparison'] = df['company'] == df['company'].shift(-1)
这样Pandas会自动逐行比较:第n行的company值和第n+1行的company值(也就是shift(-1)后的第n行值),得到对应的布尔结果。
处理最后一行的特殊情况
因为shift(-1)会让最后一行的shift_minus_1值为NaN,和NaN对比的结果是False(或者你可以根据需求自定义处理),如果想把最后一行的对比结果明确设为False(因为没有下一行可对比),可以用fillna处理:
df['comparison'] = df['company'] == df['company'].shift(-1) # 把最后一行的NaN替换为False df['comparison'] = df['comparison'].fillna(False)
示例演示
比如我们构造一个简单的DataFrame:
import pandas as pd data = {'company': ['A', 'A', 'B', 'B', 'C']} df = pd.DataFrame(data) # 添加shift列 df['shift_minus_1'] = df['company'].shift(-1) # 正确的逐行对比 df['comparison'] = df['company'] == df['company'].shift(-1)
得到的结果会是:
| company | shift_minus_1 | comparison |
|---|---|---|
| A | A | True |
| A | B | False |
| B | B | True |
| B | C | False |
| C | NaN | False |
这样就实现了你想要的逐行对比效果啦。
内容的提问来源于stack exchange,提问作者Theo
相关产品推荐
相关产品推荐

