利用groupby与isin查找企业新增出口目的地(Pandas数据处理)
嘿,我来帮你搞定这个问题!要找出各企业2016年相对2015年新增的出口目的地,咱们可以用分组结合集合判断的方式来实现,具体步骤和代码如下:
具体实现方案
步骤1:准备数据并提取2015年各企业的出口目的地集合
首先咱们先加载数据,然后把每个企业(Id)在2015年的所有出口目的地存成集合——用集合的好处是判断元素是否存在的速度更快:
import pandas as pd # 初始化你的数据 df = pd.DataFrame({ "Id":[1,1,1,1,1,1,2,2,2,3,3], "Year":[2015,2015,2016,2016,2016,2016,2015,2016,2016,2015,2016], "Destiny":['A','B','A','B','C','D','C','C','D','A','Z'] }) # 提取每个Id对应的2015年出口目的地集合,转成字典方便后续查询 destiny_2015 = df[df['Year'] == 2015].groupby('Id')['Destiny'].apply(set).to_dict()
步骤2:筛选2016年的新增目的地
接下来咱们聚焦2016年的数据,先去除重复的(同一个企业同一个目的地只留一条),再筛选出那些不在该企业2015年目的地列表里的记录:
# 提取2016年数据并去重,避免同一目的地多次出现 df_2016 = df[df['Year'] == 2016].drop_duplicates(subset=['Id', 'Destiny']) # 判断每行的目的地是否是2016年新增的 is_new = df_2016.apply(lambda row: row['Destiny'] not in destiny_2015.get(row['Id'], set()), axis=1) # 筛选出新增记录并整理格式 result = df_2016[is_new][['Id', 'Year', 'Destiny']].sort_values('Id').reset_index(drop=True) # 输出结果 print(result)
运行这段代码后,你会得到如下输出:
Id Year Destiny 0 1 2016 C 1 1 2016 D 2 2 2016 D 3 3 2016 Z
这里需要说明下:按照原数据,企业1的C和D都是2016年新增的(2015年只有A、B),企业2的D也是新增的(2015年只有C)。如果你的期望输出是只保留某些特定新增项,可能需要额外的过滤条件,但上面的代码是通用的解决方案,能找出所有符合条件的新增目的地。
内容的提问来源于stack exchange,提问作者Lucas Dresl
相关产品推荐
相关产品推荐

