从数据框创建字典,其中多列的元组作为键,另一列作为值
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'
【讨论】:
以上是关于从数据框创建字典,其中多列的元组作为键,另一列作为值的主要内容,如果未能解决你的问题,请参考以下文章