我有一个表,其中在第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数据框架。
你的表看起来像什么?
字典表:
给定字典数据帧格式
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