【问题标题】:Translate my SKUs using a dictionary with Pandas使用带有 Pandas 的字典翻译我的 SKU
【发布时间】:2021-05-12 20:59:42
【问题描述】:

我有一个表,其中在第 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 的值。谁能帮我加快速度?


之前提出的一些问题:

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

是的。我正在研究两个熊猫数据框。

你的桌子是什么样子的?

字典表:

SKU0 Synonym 0 Synonym 1 Synonym 2
foo bar bar1
foo1 baar1
foo2 baaar0 baar2

值表:

SKU Value Value1 value1
foo 3 1 7
baar1 4 5 7
baaar0 5 5 9

想要的表:

SKU Value Value1 value1
foo 3 1 7
foo1 4 5 7
foo2 5 5 9

调用此函数的其余代码是什么样的?

df1.sku = new_array('df1', list(df1.sku), sku_dic)

【问题讨论】:

    标签: pandas performance indexing


    【解决方案1】:

    给定字典数据框的格式

    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"]
    })
    

    和格式中的值数据框

    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
    

    【讨论】:

    • @mixcocam 即使表格的长度不同,这种方法也可以使用,但您可能需要更改的唯一一件事是如何合并两个表格,具体取决于您希望如何处理这些情况。跨度>
    • 谢谢@oxbowerce。有没有什么方法可以用你的方法轻松提取我字典里没有的SKU?
    • 是的,如果您将合并类型更改为"outer" 和参数argument=True,您可以看到哪些记录在哪个表中,另请参见this answer
    • 你知道这是否可以使用 SQL 实现吗?直接使用 sqlite 实现这种转换会很棒。
    • 这绝对可以使用 SQL。虽然通常您可以使用 UNPIVOT 将数据从宽格式转换为长格式,但 SQLite 没有此运算符,因此您需要使用多个 SELECT 语句和 UNION ALL 之间的语句。见this sqlfiddle example
    猜你喜欢
    • 2018-11-26
    • 2011-12-01
    • 2022-11-30
    • 1970-01-01
    • 1970-01-01
    • 2017-10-01
    • 2020-02-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多