Creating/updating 从第二个数据帧中的多个匹配中随机匹配的新字段
Creating/updating new field with random match from multiple matches in second dataframe
我有一个数据框县:
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”字段。换句话说,在第二个数据框中有多个 zip 与一个县 ID 相关联;我只想得到其中一个(不是第一个或最后一个,而是随机的,从技术上讲可以是第一个或最后一个,我只是希望它不要总是第一个或最后一个,而且我不想指定第 3 个、第 4 个等匹配,因为有时可能只有一个匹配项,或者没有匹配项)。所以,我想要的结果(数据框 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)
随机选择一个。如果你想 select 对于相同的 county 始终使用相同的 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
我有一个数据框县:
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”字段。换句话说,在第二个数据框中有多个 zip 与一个县 ID 相关联;我只想得到其中一个(不是第一个或最后一个,而是随机的,从技术上讲可以是第一个或最后一个,我只是希望它不要总是第一个或最后一个,而且我不想指定第 3 个、第 4 个等匹配,因为有时可能只有一个匹配项,或者没有匹配项)。所以,我想要的结果(数据框 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)
随机选择一个。如果你想 select 对于相同的 county 始终使用相同的 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