Python中实现类VLOOKUP匹配标记功能时遇执行失败问题
解决Table2根据Table1的Key标记Flag的问题
我最近碰到这么个需求:手里有Table1.csv和Table2.csv两个表格,它们都包含共同的Key列。想要实现的效果是:如果Table2.csv里的Key在Table1.csv中存在,就给Table2新增一列Flag标记为1,不存在就标记为0。之前试着用了一段代码table1['flag']=table2.key.map(table1.key),结果啥反应都没有——既没复制内容也没加上标记,折腾了好一会儿才找到问题所在,现在把解决办法分享出来。
输入输出示例
输入表格
Table1.csv
| Key |
|---|
| a |
| b |
| c |
| f |
Table2.csv
| Key |
|---|
| a |
| b |
| c |
| d |
| e |
| f |
期望输出的Table2.csv
| Key | Flag |
|---|---|
| a | 1 |
| b | 1 |
| c | 1 |
| d | 0 |
| e | 0 |
| f | 1 |
问题出在哪?
你之前用的代码逻辑完全搞反了:首先是给table1加flag列,但我们的需求是给table2加列;其次table2.key.map(table1.key)的用法不对——map方法需要的是一个可映射的对象(比如字典、函数),直接传Series的话,它会按索引去匹配值,而不是判断值是否存在,所以根本达不到我们要的标记效果。
两种可行的解决方法
方法1:用isin方法(最直观简单)
pandas的isin方法可以直接判断某列的值是否在另一个集合里,返回布尔值后转成int类型(True对应1,False对应0)就行:
import pandas as pd # 读取两个csv文件 table1 = pd.read_csv('Table1.csv') table2 = pd.read_csv('Table2.csv') # 新增Flag列:判断Key是否在table1的Key中,转成int类型 table2['Flag'] = table2['Key'].isin(table1['Key']).astype(int) # 保存带Flag的Table2 table2.to_csv('Table2_with_Flag.csv', index=False)
方法2:用map结合字典(适合扩展复杂映射)
如果之后需要更复杂的标记规则,可以先把table1的Key做成一个键值对字典,再用map映射,缺失的用fillna补0:
import pandas as pd table1 = pd.read_csv('Table1.csv') table2 = pd.read_csv('Table2.csv') # 构建Key到1的映射字典 key_mapping = {key: 1 for key in table1['Key']} # 映射Key,不存在的填充为0并转成int table2['Flag'] = table2['Key'].map(key_mapping).fillna(0).astype(int) # 保存结果 table2.to_csv('Table2_with_Flag.csv', index=False)
这两种方法都能完美实现需求,亲测有效!
内容的提问来源于stack exchange,提问作者Unknown
相关产品推荐
相关产品推荐

