如何使用pysp创建循环来迭代join

2024-09-28 23:09:31 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在研究Databricks,我有一个包含BOM(物料清单)列表的dataframe:下面的示例报告了dataframe的结构,其中identifier是“父”产品(成品)的代码,component是“子”产品(可以是半成品或原材料)的代码。如果组件是半成品,您也可以在标识符列表中找到它,以及它的组件(但我在数据框中没有指示产品的类型,如果是成品、半成品或原材料)。你知道吗

  identifier   component
  xxxx         yyyy
  xxxx         zzzz
  xxxx         aaaa
  aaaa         bbbb
  aaaa         cccc
  bbbb         dddd
  bbbb         eeee
  cccc         ffff
  cccc         mmmm
  ffff         aaaa
  ffff         gggg
  ffff         hhhh
  hhhh         iiii
  hhhh         jjjj

在上面的例子中有两个最终产品(xxxx和ffff)。xxxx包含yyyy、zzzz和aaaa组件。aaaa应该是半成品,因为它也列在标识栏中,由cccc和dddd组成。cccc和dddd也是半成品,因为它们列在标识栏中,由dddd、eeee、ffff和mmmm组成(因为它们不在标识栏中,所以应该是原材料)。第二个最终产品ffff由aaaa(半成品也用于xxxx)、gggg(原材料)和hhhh(半成品,由iiii和JJJ(原材料)组成)。 我必须按照业务部门提供的产品列表过滤此数据帧,该列表仅包含最终产品:假设我只能选择xxxx(ffff不在列表中)。问题是,如果我过滤xxxx,我会丢失与半成品相关的信息(如果我过滤数据帧,只选择标识符xxxx,我会得到3行,但我要做的是找到一种方法来同时保留aaaa、bbbb和cccc,以及它们各自的组件细节)。所以最终过滤的数据帧应该是

    identifier   component
  xxxx         yyyy
  xxxx         zzzz
  xxxx         aaaa
  aaaa         bbbb
  aaaa         cccc
  bbbb         dddd
  bbbb         eeee
  cccc         ffff
  cccc         mmmm

我试图找出如何用循环解决这个问题(实际的数据帧显然更大,大约13000行),但我找不到一个好的起点(我不是python专家)。有没有人把一些好的建议、文档或片段作为出发点?你知道吗


Tags: 数据列表产品组件componentccccidentifieraaaa
1条回答
网友
1楼 · 发布于 2024-09-28 23:09:31

if I filter the dataframe selecting only identifier xxxx I obtain 3 rows, but what I have to do is to find a way to keep also aaaa, bbbb and cccc

你的意思是,你必须找到一种保持yyyyzzzzaaaa的方法,因为这些都是xxxx依赖的产品?请澄清这一点,并进一步解释如何获得最终过滤的数据帧(我得到的结果不同),我很乐意提供帮助。

我仍然很乐意提供帮助,但我仍然不明白您是如何得到最终过滤的数据帧的。你知道吗

因此您选择xxxx并接收三个相关组件yyyyzzzzaaaa。然后呢?得到这三个组件的相关组件,然后递归地执行此操作,直到得到基本材质?不过,这并不能反映最终过滤的数据帧中的内容。你知道吗

编辑如果我正确理解了这个问题,下面是我的想法(我不经常使用熊猫,所以如果有熊猫的特性可以让这个可爱点,我也不会感到惊讶):

def main():

    import pandas as pd
    from queue import Queue

    df = pd.read_csv("data.csv", names=["identifier", "component"])

    result_df = pd.DataFrame()

    selected_identifier = "xxxx"
    identifier_queue = Queue()
    identifier_queue.put(selected_identifier)
    previously_seen_identifiers = set()

    while not identifier_queue.empty():
        current_identifier = identifier_queue.get()
        if current_identifier in previously_seen_identifiers:
            continue
        previously_seen_identifiers.add(current_identifier)
        current_df = df.loc[df["identifier"] == current_identifier]
        result_df = result_df.append(current_df)
        components = current_df[["component"]]["component"].tolist()
        for component in components:
            identifier_queue.put(component)

    print(result_df)

    return 0


if __name__ == "__main__":
    import sys
    sys.exit(main())

其工作原理如下:

  • 创建一个标识符队列(也可以是一个堆栈),这些标识符 需要处理。最初是要处理的唯一标识符 我们选择的最终产品(xxxx在本例中)。你知道吗
  • 当队列不为空时,获取下一个标识符并将其删除 从队列中,从原始数据帧创建一个数据帧 仅包含当前标识符所在的组件 依赖于,并将此子数据帧附加到result_df 数据帧。在我们开始下一个迭代之前,我们将 当前标识符所依赖的组件,并将其添加到 我们的未处理标识符队列。你知道吗
  • 在循环之前,我们还创建了一个set()来跟踪所有 到目前为止我们看到的标识符。在循环中,如果当前标识符 已经看到了,我们忽略它,继续下一个 标识符。这是因为有些产品看起来 具有循环依赖关系。你知道吗

如果这是你想的,请告诉我。你知道吗

相关问题 更多 >