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

如何判断DataFrame字符串值不存在于另一DataFrame?代码实现求助

问题解决:判断DataFrame中字符串是否不存在于另一个DataFrame并插入

首先,你遇到的问题核心是单个字符串不能直接调用isin()方法——isin()是Pandas Series/DataFrame的专属方法,单个元素(比如你的df_hours.iloc[i,1]取出的'A')没有这个属性,所以你的条件写法会报错。

一、先解决你循环写法的条件修正

如果一定要保留两层循环的写法,我们可以先把new_df的所有元素提取成一个集合(集合的查找效率远高于遍历整个DataFrame),然后用not in来判断:

# 提前把new_df的所有元素转成集合,避免每次循环都遍历整个new_df,提升效率
all_new_values = set(new_df.stack().values)

for i in range(len(df_hours)):
    for j in range(len(df_hours_copy)):
        # 修正后的条件:先判断两个值相等,再判断该值不在new_df的所有元素中
        if df_hours.iloc[i,1] == df_hours_copy.iloc[j,1] and (df_hours.iloc[i,1] not in all_new_values):
            # 这里执行插入new_df的操作,比如:
            new_df = pd.concat([new_df, df_hours.iloc[i:i+1]], ignore_index=True)

⚠️ 注意:df_hours_copy的作用这里不太明确,如果是用来去重的话,其实可以提前对df_hours做去重处理,没必要用两层循环,反而会大幅降低效率。

二、更高效的Pandas向量化写法(推荐)

Pandas的设计初衷就是避免用循环处理数据,向量化操作的效率比循环高几个数量级,尤其是数据量大的时候。我们可以直接筛选出符合条件的行,再批量插入:

import pandas as pd

# 步骤1:提取new_df的所有元素,转成集合(如果需要统一类型,比如都转成字符串,可以加.astype(str))
all_new_values = set(new_df.stack().astype(str).values)

# 步骤2:筛选df_hours中Category列的值不在all_new_values里的行
rows_to_insert = df_hours[~df_hours['Category'].isin(all_new_values)]

# 步骤3:把筛选出的行批量插入new_df
new_df = pd.concat([new_df, rows_to_insert], ignore_index=True)

关键说明:

  1. new_df.stack()会把new_df的所有行和列转成一个多层索引的Series,再用.values取出所有元素,转成集合后查找速度极快。
  2. ~df_hours['Category'].isin(all_new_values):isin()在这里是Series的方法,会返回一个布尔Series,~取反,得到所有不在集合里的行。
  3. pd.concat()是Pandas推荐的合并DataFrame的方法,比过时的append()更稳定可靠。

三、额外注意事项

如果new_df中存在不同数据类型(比如数字和字符串),可能会导致判断错误,比如字符串'A'和数字10不会被匹配。这时候可以统一把所有元素转成字符串:

all_new_values = set(new_df.stack().astype(str).values)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.11 07:38:10