使用第二个数据帧中的多个匹配项的随机匹配创建/更新新字段

问题描述

我有一个数据框县:

CountyID     CountyName     SalesRep     FiscalQuarter     Sales
185           Cuyahoga       Winslow      2Q19             4,564
276           Waterton       Smith        1Q17             900

第二个数据框 CountyZips 包含县 ID 及其包含的所有邮政编码:

CntyID     Zip
185          05643
185          05617
185          05866
276          32786
276          33465
276          34119

我想用新的“zip”列更新第一个数据帧,或者用该 zip 列创建新的数据帧,然后用第二个数据帧的 Zip 列中的随机匹配项填充“zip”字段。换句话说,在第二个数据帧中有多个与一个县 ID 相关联的 zips;我只想得到其中一个(不是第一个或最后一个,而是随机的,技术上可以是第一个或最后一个,我只是希望它不要总是第一个或最后一个,我不想指定第 3 个,第 4 个等匹配,因为有时可能只有一个匹配,或没有匹配)。所以,我想要的结果(数据帧 1 更新或新数据帧):

CountyID     Zip     CountyName     SalesRep     FiscalQuarter     Sales
185          05617   Cuyahoga       Winslow      2Q19             4,564
276          34119   Waterton       Smith        1Q17             900

请注意,使用来自数据框 2 的随机 zip 更新了 zip,其中县 ID 在两个数据集之间匹配。

我在上一个问题中找到了一个看似适用的答案,解决方案是:

d1[d2,on = .(gender,year,code),{ri <- sample(.N,1L)
  .(amount = amount[ri],status = status[ri])},by = .EACHI]

我尝试了这个,根据需要修改数据框和字段名称(我只匹配一个字段,而不是 3 个),但所有尝试都出现语法错误,包括当我制作与原始问题,所以我不确定这是否是 Python 版本控制问题(我使用的是 Python 3.7.4)

如果有人能帮我解决这个问题,我将不胜感激。感谢您的时间

解决方法

你可以这样做:

import random

df['Zip'] = df['CountyID'].map(zip_df.groupby('CntyID')['Zip'].agg(list)).apply(random.choice)
print(df)

输出

   CountyID CountyName SalesRep FiscalQuarter  Sales    Zip
0       185   Cuyahoga  Winslow          2Q19  4,564   5617
1       276   Waterton    Smith          1Q17    900  32786

步骤:

map(zip_df.groupby('CntyID')['Zip'].agg(list))

为每个县创建一个可能的选择列表,然后:

.apply(random.choice)

随机选择一个。如果您想为同一个选择始终相同的zip,请使用:

import random
lookup = zip_df.groupby('CntyID')['Zip'].agg(lambda x: random.choice(x.tolist()))
df['Zip'] = df['CountyID'].map(lookup)
print(df)

输出

   CountyID CountyName SalesRep FiscalQuarter  Sales    Zip
0       185   Cuyahoga  Winslow          2Q19  4,564   5617
1       276   Waterton    Smith          1Q17    900  32786

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...