pandas 检测每一行的父行并将它们的值添加到新列

htrmnn0y  于 2023-02-07  发布在  其他
关注(0)|答案(1)|浏览(142)

我有一个包含多个层次结构列和附加到它们的值的 Dataframe ,如下所示:
| | 位置层次|产业层级|价值|
| - ------|- ------|- ------|- ------|
| 无|美国|全部|第1版|
| 1个|美国加利福尼亚州|全部|第2版|
| 第二章|美国加利福尼亚州|全HT|第3版|
| 三个|美国-加利福尼亚-洛杉矶|全部|第4版|
| 四个|美国-加利福尼亚-洛杉矶|全HT|第5版|
| 五个|美国-加利福尼亚-洛杉矶|全HT软件|第6版|
| 六个|美国-加利福尼亚-洛杉矶|全制造|第七版|
现在我想找到每一行的直接父代,并将它们的值添加到一个新列中。我的示例只显示了两个父代,但可以有更多父代。因此,预期输出如下:
| | 位置层次|产业层级|价值|值-父代-1|值-父代-2|
| - ------|- ------|- ------|- ------|- ------|- ------|
| 无|美国|全部|第1版|* * 不适用**|* * 不适用**|
| 1个|美国加利福尼亚州|全部|第2版|* * 第1版**|* * 不适用**|
| 第二章|美国加利福尼亚州|全HT|第3版|* * 第二版**|* * 不适用**|
| 三个|美国-加利福尼亚-洛杉矶|全部|第4版|* * 第二版**|* * 不适用**|
| 四个|美国-加利福尼亚-洛杉矶|全HT|第5版|* * 第三版**|* * 第四版**|
| 五个|美国-加利福尼亚-洛杉矶|全HT软件|第6版|* * 第五版**|* * 不适用**|
| 六个|美国-加利福尼亚-洛杉矶|全制造|第七版|* * 第四版**|* * 不适用**|
我的 Dataframe 可能非常大,所以速度和内存是重要的因素。所以,逐行处理将无法真正工作。

    • 逻辑**:

行的直接父代将是比某个层次高一级的所有行。例如,对于行5,潜在的直接父代将是:
| - |位置层次|产业层级|
| - ------|- ------|- ------|
| 无|美国加利福尼亚州|全HT软件|
| 1个|美国-加利福尼亚-洛杉矶|全HT|
这是创建 Dataframe 的代码,如果你想玩它。

import pandas as pd

df = pd.DataFrame({'location hierarchy': ['US', 'US-California', 'US-California', 'US-California-LA', 'US-California-LA', 'US-California-LA', 'US-California-LA'],
                   'industry hierarchy': ['All', 'All', 'All-HT', 'All', 'All-HT', 'All-HT-SoftWare', 'All-Manufacturing'],
                   'value': ['V1', 'V2', 'V3', 'V4', 'V5', 'V6', 'V7']})
iqxoj9l9

iqxoj9l91#

给你:

df = pd.DataFrame({'Location Hierarchy': ['US', 'US-California', 'US-California', 'US-California-LA', 'US-California-LA', 'US-California-LA', 'US-California-LA'],
                   'Industry Hierarchy': ['All', 'All', 'All-HT', 'All', 'All-HT', 'All-HT-SoftWare', 'All-Manufacturing'],
                   'Value': ['V1', 'V2', 'V3', 'V4', 'V5', 'V6', 'V7']})

hierarchies = ["Location Hierarchy", "Industry Hierarchy"]
for i, hierarchy in enumerate(hierarchies): 
    df1 = df.copy()
    df1[hierarchy] = df1[hierarchy].str.split('-').str[:-1].str.join("-")
    df[f"Value_parent_{i+1}"] = df1.merge(df, on=hierarchies, how="left", suffixes=["", "_parent"])["Value_parent"]

相关问题