【问题标题】:How to assign values to a row based on the order of list如何根据列表的顺序为行赋值
【发布时间】:2019-03-11 15:19:44
【问题描述】:

我确定这个问题是用另一种方式提出的,但我想确定这个问题的措辞与我的理解完全一致。我还在学习熊猫,所以请耐心等待。

我有 3 个共享一个公共密钥的数据框。我需要根据数据框 C 的键值将数据框 A 的列中的值分配给数据框 B 的值。为了更好地说明这里是我的示例。

options= [["Option1", "Description1"], ["Option2", "Description2"], ["Option3", "Description3"]]
dfA = pd.DataFrame(options, columns = ["Option", "Description"]) 

links= [["Link1", "LinkDescription1"], ["Link2", "LinkDescription2"], ["Link3", "LinkDescription3"]]
dfB = pd.DataFrame(links, columns = ["Link", "LinkDescription"]) 

master_ledger = [["Option1", "Link1"], ["Option2", "Link2"], ["Option3", "Link3"]]

dfC = pd.DataFrame(master_ledger, columns = ["Option", "Link"]) 

查看我们看到的每个 DF:

dfA
Out[14]: 
    Option   Description
0  Option1  Description1
1  Option2  Description2
2  Option3  Description3
dfB
Out[15]: 
    Link   LinkDescription
0  Link1  LinkDescription1
1  Link2  LinkDescription2
2  Link3  LinkDescription3
dfC
Out[16]: 
    Option   Link
0  Option1  Link1
1  Option2  Link2
2  Option3  Link3

我正在尝试为 DFB 中的 LinkDescription 分配 dfA 中选项描述中的值,但基于 dfC 中的选项/链接关系。所以伪术语,可以写成:

dfB["LinkDiscripiton"] = dfA["描述"] ->其中 dfB["LINK_ID"] == dfC["LINK_ID"] 和 dfA["OPT_ID"] == dfC["OPT_ID"]

预期的更改将应用​​于 dfB,如下所示:

dfB
Out[15]: 
    Link   LinkDescription
0  Link1  Description1
1  Link2  Description2
2  Link3  Description3

我不太确定如何处理这个问题,所以我没有以前的方法的示例。谢谢您的帮助。

更新#

感谢 Yatu 的 Merge 建议,我发现以下方法可以解决问题并将选项描述分配到 dfB 的链接描述中:

df_temp = dfA.merge(dfC, on='Option')
df_temp.merge(dfB, on = 'Link')[['Link','Description']]
dfB[["Link", "LinkDescription"]] = df_temp[["Link", "Description"]]    

dfB:
Out[63]: 
    Link LinkDescription
0  Link1          Description1
1  Link3          Description2
2  Link2          Description3

也只是为了更好地解释所需的输出。如果我将 dfA 定义为: options= [["Option1", "Bronze"], ["Option2", "Gold"], ["Option3", "Silver"]] dfA = pd.DataFrame(options, columns = ["Option", "Description"])

dfA
Out[68]: 
    Option Description
0  Option1      Bronze
1  Option2        Gold
2  Option3      Silver

那么 dfB 会改为:

Out[63]: 
    Link LinkDescription
0  Link1          Bronze
1  Link3            Gold
2  Link2          Silver

【问题讨论】:

    标签: python pandas


    【解决方案1】:

    您可以使用pd.merge 将三个数据框合并到其对应的键上,然后保留属于dfB 的列:

    df_temp = dfA.merge(dfC, on='Option').merge(dfB, on = 'Link')[['Link','Description']]
    
       Link   Description
    0  Link1  Description1
    1  Link2  Description2
    2  Link3  Description3
    

    【讨论】:

    • 好的,这就是我需要的。但是,我的情况略有变化。我需要将链接描述更新为选项描述。因此,不要使用 [['Link', 'LinkDescription']],只需使用 'Description' 而不是 'LinkDescription'。并出现所需的输出。感谢您的帮助。
    • 好的,更新了@RockAndRoleCoder 的答案。不客气
    • @RockAndRoleCoder 如果有帮助别忘了接受,请参阅What should I do when someone answers my question?
    猜你喜欢
    • 2018-06-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多