Pandas中如何用一个数据集的字段值筛选另一个数据集
问题背景
现有三个pandas DataFrame数据集,结构如下:
df_dict1结构:
| Code | City | State | QTY |
|---|---|---|---|
| 110001 | Los Angeles | CA | 0 |
| 110002 | Houston | TX | 0 |
| 110003 | New York | NY | 0 |
| ... | ... | ... | 0 |
| 999999 | Fresno | CA | 0 |
df_dict2结构:
| Code | City | State | QTY |
|---|---|---|---|
| 220001 | San Diego | CA | 304 |
| 220002 | Austin | TX | 200 |
| 220003 | Albany | NY | 2004 |
| ... | ... | ... | 3220 |
| 888888 | San Francisco | CA | 320 |
- 待拆分的主表
df结构:
| Code | Date | City | State | Cases |
|---|---|---|---|---|
| 110001 | 2021-01-01 | Los Angeles | CA | 112 |
| 110001 | 2021-01-02 | Los Angeles | CA | 123 |
| 110002 | 2021-01-01 | Houston | TX | 1112 |
| ... | ... | ... | ... | ... |
| 888888 | 2021-01-01 | San Francisco | CA | 1234 |
| 999999 | 2021-01-01 | Fresno | CA | 1113 |
需求为将df按Code列拆分为两个独立DataFrame:
df_filtered1:包含df中所有Code存在于df_dict1['Code']的行df_filtered2:包含df中所有Code存在于df_dict2['Code']的行
实现方案
直接用pandas内置的isin()方法做布尔索引筛选即可,性能好、写法简洁,不需要逐行循环判断。
# 提取两个参考表的Code列作为匹配依据 code_set1 = set(df_dict1['Code']) code_set2 = set(df_dict2['Code']) # 按条件筛选拆分 df_filtered1 = df[df['Code'].isin(code_set1)] df_filtered2 = df[df['Code'].isin(code_set2)]
注意事项
- 将Code列转为集合再传入
isin()不是强制要求,但数据量较大时,集合的成员判断速度远快于列表,能明显提升筛选效率 - 如果两个参考表的Code列和主表
df的Code列数据类型不一致(比如一边是整数、一边是字符串),先统一数据类型再做匹配,否则会出现匹配失效的问题,统一类型写法示例:df['Code'] = df['Code'].astype(str) - 如果
df_dict1和df_dict2的Code值没有重叠,拆分完成后可以用下面的代码校验结果是否正确:
# 校验拆分后行数总和与原表是否一致 print(len(df_filtered1) + len(df_filtered2) == len(df))
内容的提问来源于stack exchange,提问作者RafaelP
相关产品推荐
相关产品推荐

