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

Pandas中DataFrame条目对比异常:为何无法识别剧集数差异

问题分析与解决方案:DataFrame对应条目剧集数差异检测失效

咱们来一步步拆解你的问题,你的代码之所以全输出True,核心是两个关键错误:

1. any()方法的误用

你代码里的.any()是用来判断一个Series中是否存在至少一个非零、非空、非False的值,而不是比较两个Series的内容是否完全一致。比如只要episodes列里有数值(不管具体是多少),.any()都会返回True。所以你写的条件(df[...]['episodes']).any() == (df1[...]['episodes']).any(),本质上是在判断“两边的episodes列有没有值”,而不是“两边的episodes值是否相同”——显然两边都有数值,所以永远是True。

2. 循环匹配逻辑的偏差

你循环遍历df['name']的每个值,然后用str.contains(names)匹配所有同名行,这会把所有重复的同名条目都捞出来(比如Sheldon出现两次)。但你并没有逐行对应比较这些条目,而是直接对整个匹配到的Series调用.any(),完全忽略了“对应条目”的要求。


正确的解决方案

根据你的需求(检查两个DataFrame中对应条目的剧集数差异),分两种场景给出方案:

场景1:两个DataFrame的行顺序完全对应(每一行都是同一个条目)

如果df和df1的行是一一对应的(比如顺序完全一致,第i行都是同一个人的同一条记录),直接逐列比较即可:

import pandas as pd
import numpy as np

data = {'name': ['Sheldon', 'Penny', 'Amy', 'Penny', 'Raj', 'Sheldon'], 'episodes': [42, 24, 31, 29, 37, 40], 'gender': ['male', 'female', 'female', 'female', 'male', 'male']}
data1 = {'name': ['Sheldon', 'Penny', 'Amy', 'Penny', 'Raj', 'Sheldon'], 'episodes': [12, 32, 31, 32, 37, 40], 'gender': ['male', 'female', 'female', 'female', 'male', 'male']}
df1 = pd.DataFrame(data1, columns=['name','episodes', 'gender'])
df = pd.DataFrame(data, columns=['name','episodes', 'gender'])

# 直接比较两列的每个值是否相等
diff_results = df['episodes'] == df1['episodes']
for result in diff_results:
    print(result)

运行后会输出:False, False, True, False, True, True,完全符合你的预期。

场景2:需要按name匹配对应条目(不要求行顺序一致)

如果两个DataFrame的行顺序可能不同,但你要按name分组比较所有同名条目的剧集数是否一致,可以用分组后比较的方式:

import pandas as pd
import numpy as np

data = {'name': ['Sheldon', 'Penny', 'Amy', 'Penny', 'Raj', 'Sheldon'], 'episodes': [42, 24, 31, 29, 37, 40], 'gender': ['male', 'female', 'female', 'female', 'male', 'male']}
data1 = {'name': ['Sheldon', 'Penny', 'Amy', 'Penny', 'Raj', 'Sheldon'], 'episodes': [12, 32, 31, 32, 37, 40], 'gender': ['male', 'female', 'female', 'female', 'male', 'male']}
df1 = pd.DataFrame(data1, columns=['name','episodes', 'gender'])
df = pd.DataFrame(data, columns=['name','episodes', 'gender'])

# 按name分组,逐个比较每组的episodes序列
for name in df['name'].unique():
    # 获取两个df中当前name的所有episodes值,重置索引保证顺序对应
    df_episodes = df[df['name'] == name]['episodes'].reset_index(drop=True)
    df1_episodes = df1[df1['name'] == name]['episodes'].reset_index(drop=True)
    # 比较两个序列是否完全一致
    print(df_episodes.equals(df1_episodes))

运行后会输出每个唯一name的比较结果:False, False, True, True(对应Sheldon、Penny、Amy、Raj)。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.30 14:22:49