PySpark筛选同时关联两个指定unit的地址数据的实现方法
数据集拆分实现方案
前两类关联单个unit的数据集
- 关联LG203(对应unit值
203X)的数据集:
# spark写法 lg203_df = ds.filter(ds.unit == "203X") # pandas写法也可使用 lg203_df = ds[ds['unit'] == '203X']
- 关联LG302(对应unit值
302Z)的数据集:
# spark写法 lg302_df = ds.filter(ds.unit == "302Z") # pandas写法也可使用 lg302_df = ds[ds['unit'] == '302Z']
第三类同时关联两个unit的数据集
你之前使用字符串拼接的方案存在逻辑冗余、容易出现匹配错误的问题,推荐使用更简便的分组统计唯一值方案,实现逻辑如下:
- 先过滤出仅包含目标unit的行,排除其他无关unit的干扰
- 按地址分组统计每个地址对应的不同unit的数量,筛选出数量等于2的地址
- 用筛选出的地址过滤原数据集即可得到目标结果
示例代码(pandas环境):
# 方法1:分步骤实现,可读性更高 target_units = {"203X", "302Z"} # 筛选同时关联两个unit的地址列表 valid_addrs = ds[ds["unit"].isin(target_units)]\ .groupby("ADDRESS")["unit"].nunique() valid_addrs = valid_addrs[valid_addrs == 2].index # 生成目标数据集 both_unit_df = ds[ds["ADDRESS"].isin(valid_addrs)]
如果需要更精简的写法,可以用transform直接生成布尔索引一步过滤:
# 方法2:精简写法 target_units = {"203X", "302Z"} both_unit_df = ds[ds.groupby("ADDRESS")["unit"]\ .transform(lambda x: set(x) >= target_units)]
两种方法的执行效率都远高于字符串拼接,且不会出现因unit值字符重叠导致的误判问题。
内容的提问来源于stack exchange,提问作者Martin Walczyński
相关产品推荐
相关产品推荐

