Pandas中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

