基于另一个DataFrame删除行:不新建DataFrame实现df1匹配df2
不创建新DataFrame且不用merge实现df1匹配df2的方案
嘿,根据你描述的需求(两个行数不同的DataFrame,要让df1匹配df2,不能建新对象也不能用merge),结合你给出的df1是加州县名列表的情况,我分两种常见的“匹配”场景给你具体实现方案:
场景1:过滤df1,只保留df2中存在的行
假设两个DataFrame都有共同的标识列(比如你的df1里的县名,我们先给它命名为'County'),可以直接在原df1上做修改,不用生成新对象:
# 先给无列名的df1补上列名(如果你的df1已经有列名可以跳过这步) df1.columns = ['County'] # 获取df2中存在的县名集合,提升匹配效率 valid_counties = set(df2['County']) # 方法1:用drop删除不匹配的行,inplace=True直接修改原df1 df1.drop(df1[~df1['County'].isin(valid_counties)].index, inplace=True) # 方法2:用切片赋值覆盖原df1内容,避免创建新对象 df1[:] = df1[df1['County'].isin(valid_counties)]
这里要注意第二种方法里的df1[:]——它是直接修改原DataFrame内部的数据,而不是重新给df1变量赋值新的对象,完全符合你“不创建新DataFrame”的要求。
场景2:把df2的关联数据映射到df1中(新增列)
如果你的需求是把df2里的对应数据(比如人口、区域代码等)匹配到df1的对应行,直接用map方法修改原df1就可以,全程不用merge:
# 先把df2转换成以县名为索引的Series,方便快速映射 # 把'Target_Data'换成你要从df2取的列名,比如'Population' df2_mapper = df2.set_index('County')['Target_Data'] # 直接给df1新增列并赋值,修改原对象 df1['Target_Data'] = df1['County'].map(df2_mapper)
这样处理后,df1会新增一列,匹配到的行会显示df2对应的数据,未匹配的行则显示NaN,整个过程没有生成任何新的DataFrame。
小提示
如果你的df1是只有索引和值的Series(不是DataFrame),可以先转成DataFrame再操作:
df1 = df1.to_frame('County')
内容的提问来源于stack exchange,提问作者Glenn G.
相关产品推荐
相关产品推荐

