【发布时间】:2022-01-06 10:50:15
【问题描述】:
您好,我有一个包含多个家庭的数据集,其中家庭中的所有人都在两个数据源之间进行了匹配。因此,数据框由一个“家庭”列和两个人列(每个数据源一个)组成。但是有些人(例如下面的 Jonathan 或 Peter)无法匹配,因此第二人称栏为空白。
| Household | Person_source_A | Person_source_B |
|---|---|---|
| 1 | Oliver | Oliver |
| 1 | Jonathan | |
| 1 | Amy | Amy |
| 2 | David | Dave |
| 2 | Mary | Mary |
| 3 | Lizzie | Elizabeth |
| 3 | Peter |
由于数据框很大,我的目标是对不匹配的个人进行抽样,然后输出一个包含家庭中所有人员的 df,其中只有抽样不匹配的人存在。即说我的随机样本包括 Oliver 但不包括 Peter,那么我只会在输出中包含家庭 1。
我的问题是我已过滤以获取样本,但现在无法取得进展。 join、agg/groupBy... 的某种组合会起作用,但我很挣扎。我在采样的不匹配名称中添加了一个标志来识别它们,我认为这很有帮助...
我的代码:
# filter to unmatched people
df_unmatched = df.filter(col('per_A').isNotNull()) & col('per_B').isNull())
# take random sample of 10%
df_unmatched_sample = df_unmatched.sample(0.1)
# add flag of sampled unmatched persons
df_unmatched_sample = df_unmatched.withColumn('sample_flag', lit('1'))
【问题讨论】:
-
如果您的样本同时包含
Oliver和Peter怎么办?那你会选择哪个家庭? -
对不起,我可能没有解释清楚。在这种情况下,我希望输出仅显示家庭 1 和 3,因为它们将是包括抽样不匹配的人 Oliver、Jonathan 和 Peter 的家庭。 (我应该说不匹配会导致空的第二人称列,而不是第一人称)
-
我认为你最好用每个案例的示例来更新你的问题
-
没有变化。我只是想减少我的数据框,只显示存在一个不匹配的人的家庭的完整家庭,这些家庭是由所有不匹配的人中的随机样本选择的
标签: apache-spark join pyspark group-by apache-spark-sql