如何使用Pandas在列B中迭代搜索列A的值,直到没有进一步的匹配?

ej83mcc0  于 2023-01-19  发布在  其他
关注(0)|答案(1)|浏览(127)

作为一个例子,我有下表:
| 组别名称|父组ID|组ID|
| - ------|- ------|- ------|
| 所有食品||三个|
| 意大利食品|三个|1个|
| 面食|1个|第二章|
| 意大利面|第二章|四个|
组ID是任意分配的。此表表示一系列嵌套组。您可以看到,"Spaghetti"的父组ID为2,与"Pasta"的组ID相对应。而"Pasta"的父组ID为1,表示其父组是意大利食品。
我希望能够遍历每一行,确定父组ID,然后按照父组ID-组ID链查找该行组的顶级父组名称。对于第5行"Spaghetti",我希望查找"All Foods"是其顶级父组名称。
到目前为止,我已经尝试使用Pandas的外部加入功能无济于事。任何建议将非常感谢。
我设想的流程是这样的:
1.在表的右侧添加一列
1.遍历每行
1.查找组ID值
1.在parentID列中搜索groupID值
1.重复此步骤,直到parentID值为空
1.将最后一行的组名添加到原始行的附加列中

iklwldmw

iklwldmw1#

您可以使用while..loop迭代 Dataframe 中的每一行,并使用.loc方法访问基于Group IDParent Group ID列的特定行。以下是如何实现此操作的示例:

# Create the dataframe
df = pd.DataFrame(
    {
        "Group Name": [
            "All Foods",
            "Italian Foods",
            "Pasta",
            "Spaghetti",
            "Sushi",
            "Seafood",
            "Japanese Cusine",
        ],
        "Parent Group ID": [None, 3, 1, 2, 6, 7, None],
        "Group ID": [3, 1, 2, 4, 5, 6, 7],
    }
)
df

| | 组别名称|父组ID|组ID|
| - ------|- ------|- ------|- ------|
| 无|所有食品|钠氮|三个|
| 1个|意大利食品|三个|1个|
| 第二章|面食|1个|第二章|
| 三个|意大利面|第二章|四个|
| 四个|寿司|六个|五个|
| 五个|鱼|七|六个|
| 六个|日本料理|钠氮|七|

# Add a new column to the dataframe
df['Top-level Parent Group Name'] = ""

# Iterate through each row in the dataframe
for index, row in df.iterrows():
    parent_id = row['Parent Group ID']
    fill_parent = False
    parent_row = pd.Series()
    # Traceback parent group name until a parent ID equal to `None` or `""` 
    # (empty string) is found
    while parent_id != "" and not pd.isna(parent_id):
        parent_row = df.loc[df['Group ID'] == parent_id]
        parent_id = [*parent_row['Parent Group ID'].values, ""][0]
        fill_parent = True
    if not parent_row.empty and fill_parent:
        df.at[index, 'Top-level Parent Group Name'] =
        parent_row['Group Name'].values[0]

df
    • 产出:**

| | 组别名称|父组ID|组ID|顶级父组名称|
| - ------|- ------|- ------|- ------|- ------|
| 无|所有食品|钠氮|三个||
| 1个|意大利食品|三个|1个|所有食品|
| 第二章|面食|1个|第二章|所有食品|
| 三个|意大利面|第二章|四个|所有食品|
| 四个|寿司|六个|五个|日本料理|
| 五个|鱼|七|六个|日本料理|
| 六个|日本料理|钠氮|七||

解释

该代码向名为Top-level Parent Group Name的 Dataframe 添加一个新列,并使用每行对应的顶级父组名填充该列。对于'Spaghetti'行,顶级父组名将为'All Foods'

备注

需要注意的是,此代码假定每个Group Name值只有一个直接父组。如果一个Group Name(如'Pasta')在一行中的直接父组为'Italian Foods',而在另一行中的直接父组为'Sushi',则代码将无法按预期工作。此外,代码将处理Parent Group ID列中的NaN值,因此不会导致错误。

相关问题