在第二个数据帧中创建/更新具有随机匹配的新字段



我有一个数据帧Counties:

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相关联的多个zip;我只想得到其中一个(不是第一个或最后一个,而是随机的,从技术上讲,这可能是第一个或第二个,我只希望它不总是第一个或第一个,我不想指定第三个、第四个等匹配,因为有时可能只有一个匹配,或者没有匹配(。因此,我想要的结果(更新的数据帧1或新的数据帧(:

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

请注意,zip是用数据帧2中的随机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

相关内容

  • 没有找到相关文章