如何判断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)
关键说明:
new_df.stack()会把new_df的所有行和列转成一个多层索引的Series,再用.values取出所有元素,转成集合后查找速度极快。~df_hours['Category'].isin(all_new_values):isin()在这里是Series的方法,会返回一个布尔Series,~取反,得到所有不在集合里的行。pd.concat()是Pandas推荐的合并DataFrame的方法,比过时的append()更稳定可靠。
三、额外注意事项
如果new_df中存在不同数据类型(比如数字和字符串),可能会导致判断错误,比如字符串'A'和数字10不会被匹配。这时候可以统一把所有元素转成字符串:
all_new_values = set(new_df.stack().astype(str).values)
内容的提问来源于stack exchange,提问作者ParshvaShah
相关产品推荐
相关产品推荐

