使用Pandas字典翻译我的sku



我有一个表,其中在第0列中有内部sku,然后在该行中有同义词。同义词的数量不是恒定的(范围从0到7,但会有增长的趋势)

我需要一个有效的函数,它将允许我从一个大表中的一列获得sku,并将它们从我的另一个表翻译为同义词0。

这是我当前的函数,它从一个表中获取sku数组,在另一个表中搜索它们,并给出它找到同义词的第一列值。

def new_array(dfarray1, array1, trans_dic): 
missing_values = set([])
new_array = [] 
for value in array1: 
pos = trans_dic.eq(str(value)).any(axis=1)
if len(pos[pos]) > 0 : 
new_array.append(trans_dic['sku_0'][pos[pos].index[0]])
else: 
missing_values.add(str(value))
if len(missing_values) > 0 :         
print("The following values are missing in dictionary. They are in DF called:"+dfarray1)
print(missing_values)
sys.exit()
else: 
return new_array

我确信这篇文章写得很糟糕,因为我的笔记本电脑只花了大约3分钟的时间来浏览大约75K的值。有人能帮我快一点吗?


之前问的一些问题:

你的函数参数是什么类型?(可以猜熊猫,但没办法确定)

是的。我正在处理两个pandas数据框架。

你的表看起来像什么?

字典表:

baar2

给定字典数据帧格式

df_dict = pd.DataFrame({
"SKU0": ["foo", "foo1", "foo2"],
"Synonym 0": ["bar", "baar1", "baaar0"],
"Synonym 1": ["bar1", np.nan, np.nan],
"Synonym 2": [np.nan, np.nan, "baar2"]
})

和格式为

的values数据框架
df_values = pd.DataFrame({
"SKU": ["foo", "baar1", "baaar0"],
"Value": [3, 4, 5],
"Value1": [1, 5, 5],
"value1": [7, 7, 9]
})

你可以得到你想要的输出,首先使用pd.melt重构你的字典数据框,然后将它连接到你的值数据框。然后,您可以使用一些额外的逻辑来检查从哪个列获取最终值,并选择所需的最终列。

(
df_dict
# converts dict df from wide to long format
.melt(id_vars=["SKU0"])
# filters rows where there is no synonym
.loc[lambda x: x["value"].notna()]
# join dictionary with values df
.merge(df_values, how="right", left_on="value", right_on="SKU")
# get final value by taking the value from column "SKU0" if available, else "SKU"
.assign(SKU = lambda x: np.where(x["SKU0"].isna(), x["SKU"], x["SKU0"]))
# select final columns needed in output
[["SKU", "Value", "Value1", "value1"]]
)
# output
SKU     Value   Value1  value1
0   foo     3       1       7
1   foo1    4       5       7
2   foo2    5       5       9

最新更新