Pandas:比对两个DataFrame,替换不在指定列中的值为'Others'
解决DataFrame按列匹配替换值的问题
嘿,这事儿不难,咱们直接上手搞定:
首先先把两个DataFrame定义好:
import pandas as pd df1 = pd.DataFrame({'name': ['AUD','CAD', 'SMI','Joy', 'SHA', 'CHY', 'AUD', 'KRL'], 'sal': [200,300,600,500,300,200,100,350]}) df2 = pd.DataFrame({'name': ['SMI','Joy', 'SHA', 'CHY'], 'sal': [600,500,300,200]})
接下来核心操作就是判断df1的name列值是否存在于df2的name列里,不存在的就替换成'Others'。这里用isin()方法做判断,再结合mask()或者where()就能轻松实现:
# 方法1:用mask(),把符合条件(不在df2的name里)的项替换成指定值 df1['name'] = df1['name'].mask(~df1['name'].isin(df2['name']), 'Others') # 或者方法2:用where(),逻辑反过来,把不符合条件的项替换成指定值 # df1['name'] = df1['name'].where(df1['name'].isin(df2['name']), 'Others')
执行完上面的代码后,df1就变成你想要的new_df了,输出看看:
print(df1)
输出结果:
name sal 0 Others 200 1 Others 300 2 SMI 600 3 Joy 500 4 SHA 300 5 CHY 200 6 Others 100 7 Others 350
简单说下逻辑:df1['name'].isin(df2['name'])会生成一个布尔序列,标记每个name是否在df2的name列表里。~符号是取反,也就是标记那些不在列表里的项,然后mask()会把这些标记为True的项替换成'Others',完美匹配你的需求!
内容的提问来源于stack exchange,提问作者Rahul
相关产品推荐
相关产品推荐

