【问题标题】:Creating/updating new field with random match from multiple matches in second dataframe从第二个数据帧中的多个匹配创建/更新具有随机匹配的新字段
【发布时间】:2021-01-04 16:30:01
【问题描述】:

我有一个数据框县:

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;我只想得到其中一个(不是第一个或最后一个,而是随机的,从技术上讲可能是第一个或最后一个,我只是希望它不总是第一个或最后一个,我不想指定第 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)

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

【问题讨论】:

    标签: python pandas dataframe random many-to-one


    【解决方案1】:

    你可以这样做:

    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)
    

    随机选择一个。如果您想为同一个 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
    

    【讨论】:

    • 太棒了,做到了。非常感谢,我不后悔在提出要求之前尝试让它工作的时间,但是哇,做某事并看到它工作是非常令人兴奋的。一个问题;我在执行此操作时收到 Python 反馈:SettingWithCopyWarning: A value is trying to be set on a copy of a slice from a DataFrame。尝试改用 .loc[row_indexer,col_indexer] = value 这是某种最佳实践吗,我应该采取不同的方式,例如创建新的数据框而不是更新现有的数据框?
    • 恕我直言,如果您查看 pandas 函数,通常最好创建一个新的 DataFrame,默认情况下它们必须创建一个新的 DataFrame。
    猜你喜欢
    • 2018-04-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-07
    相关资源
    最近更新 更多