You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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的数据集

你之前使用字符串拼接的方案存在逻辑冗余、容易出现匹配错误的问题,推荐使用更简便的分组统计唯一值方案,实现逻辑如下:

  1. 先过滤出仅包含目标unit的行,排除其他无关unit的干扰
  2. 按地址分组统计每个地址对应的不同unit的数量,筛选出数量等于2的地址
  3. 用筛选出的地址过滤原数据集即可得到目标结果

示例代码(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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.01 16:09:03