从数据框创建字典,其中多列的元组作为键,另一列作为值

Posted

技术标签:

【中文标题】从数据框创建字典,其中多列的元组作为键,另一列作为值【英文标题】:From dataframe create dict with tuple of multiple columns as key and another column as value 【发布时间】:2020-12-14 16:52:03 【问题描述】:

我有一个格式如下的数据框:

Sr. |  From  | Tran type | Inv type |  Opposite   |    Comment   |
------------------------------------------------------------------
6   | Seller |    X, Y   |   P, Q   |    Buyer    | Rand comment |

“老先生”在哪里是 df 的索引。 df 中有几行,每行的 'Tran type' 和 'Inv type' 列中有不同数量的值。

我想创建一个字典列表:

k:v = (From, Tran type, Inv type, To) : Comment 

key 本质上是 4 列的叉积,每个 key 只会包含一个 Tran 类型和 Inv 类型的值。对于上面的例子,它应该是这样的:


 (Seller, X, P, Buyer): Rand Comment,
 (Seller, X, Q, Buyer): Rand Comment,
 (Seller, Y, P, Buyer): Rand Comment,
 (Seller, Y, Q, Buyer): Rand Comment

这是我现在使用的代码:

def create_combos_dict(rule):
    tran_types = str(rule['Tran type'])
    tran_types = tran_types.split()
    inv_types = str(rule['Inv type'])
    inv_types = inv_types.split()
    from_side = str(rule['From'])
    opposite = str(rule['Opposite'])
    
    key_tuple = product([from_side], tran_types, inv_types, [opposite])
    combos_dict = combo:str(rule['Comment']) for combo in key_tuple
    return combos_dict

mapped_dict = 
mapped_dict.update(df.apply(create_combos_dict, axis=1))
mapped_dict

但是,这是我得到的输出:

6: 
        (Seller, X, P, Buyer): Rand Comment,
        (Seller, X, Q, Buyer): Rand Comment,
        (Seller, Y, P, Buyer): Rand Comment,
        (Seller, Y, Q, Buyer): Rand Comment
    

为什么字典是用“Sr.”形成的作为键,值是我正在制作的实际字典?

目前,我正在遍历 combos_dict.values() 并将它们添加到另一个字典中。但是肯定有一些简单的解决方法吗?

【问题讨论】:

你能分享一个你的数据框样本吗?我想我会先尝试将数据框调整为更好的格式(具有像 (Seller, X, P, Buyer) 这样的列),然后生成字典。 很遗憾,我不能,它在我公司的 VDI 上,我不能在这里粘贴。但是,我认为按照您建议的方式制作列对我来说并不实际,因为它将手动执行我试图自动化的任务。 df 保存每个变量的可能值,我需要检查我收到的数据是否属于这些可能的组合之一,这就是为什么我要创建一个交叉产品字典,因为我的数据集和 df 很大并且在以下方面变化很大上述组合 【参考方案1】:

我的意思是:

import functools as ft
import pandas as pd

df = pd.DataFrame([[6,"Seller","X, Y","P, Q","Buyer","Rand comment"],
                  [6,"Seller","Z, Y","L, Q","Buyer","Rand comment"]],
                  columns = ["Sr.","From","Tran type","Inv type","Opposite","Comment"])

df[["col1","col2"]] = df["Tran type"].str.split(",", expand = True,)
df[["col3","col4"]] = df["Inv type"].str.split(",", expand = True,)
df["col5"] = df.apply(lambda x: (x["From"],x["col1"],x["col3"],x["Opposite"]):x["Comment"],
                                (x["From"],x["col1"],x["col4"],x["Opposite"]):x["Comment"],
                                (x["From"],x["col2"],x["col3"],x["Opposite"]):x["Comment"],
                                (x["From"],x["col2"],x["col4"],x["Opposite"]):x["Comment"],axis = 1)

ft.reduce(lambda total,x: **total,**x,df["col5"])

输出:

('Seller', 'X', 'P', 'Buyer'): 'Rand comment',
 ('Seller', 'X', ' Q', 'Buyer'): 'Rand comment',
 ('Seller', ' Y', 'P', 'Buyer'): 'Rand comment',
 ('Seller', ' Y', ' Q', 'Buyer'): 'Rand comment',
 ('Seller', 'Z', 'L', 'Buyer'): 'Rand comment',
 ('Seller', 'Z', ' Q', 'Buyer'): 'Rand comment',
 ('Seller', ' Y', 'L', 'Buyer'): 'Rand comment'

【讨论】:

以上是关于从数据框创建字典,其中多列的元组作为键,另一列作为值的主要内容,如果未能解决你的问题,请参考以下文章

将带有元组作为键的嵌套字典转换为数据框

从 dict 创建数据框,其中键是元组,值是列表

返回与字典中第三个值最小的元组对应的键

python的元组能作为字典的key吗?为什么?

python的元组能作为字典的key吗?为什么?

python的元组能作为字典的key吗?为什么?