我有一个数据帧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