gpt4 book ai didi

python - 使用pandas对分层数据[Parent->Child]树进行高效分组

转载 作者:行者123 更新时间:2023-12-01 07:03:07 27 4
gpt4 key购买 nike

我有一个看起来像这样的数据框,每个数据框都有一个祖先 -> 父 -> 子关系。我想通过追踪祖先并递归地查找子代来对数据进行分组。

No  Name    Ancestor MyID Parent_Id
1 Tom 191 211 111
2 Galie 191 209 111
3 Remo 434 200 101
4 Carmen 454 212 121
5 Alfred 191 111 191
6 Marvela 191 101 111
7 Armin 322 234 101
8 Boris 989 454 109
9 Katya 921 109 323
10 Adam 191 191 Null

例如:

祖先:191 将导致继承顺序:

(祖 parent -> parent -> child )。

1  Adam      191     191 Null
2 Alfred 191 111 191
3 Tom 191 211 111
4 Galie 191 209 111
5 Marvela 191 101 111

我的方法(不使用 pandas)是首先找到列中的唯一祖先(祖先),然后使用 for 循环遍历列表中的每个唯一项目,并递归地遍历每个项目以查找子项。这很有效,但数据帧有大约 100K 的整体,而且 for 循环变得越来越昂贵。

使用 pandas 解决这个问题而不需要使用昂贵的迭代 for 循环的最佳方法是什么?

最佳答案

也许这个结果看起来像你想要的:

df_source = pd.read_excel('data8.xlsx', index_col = 'No')
df_source['Parent_Id'] = pd.to_numeric(df_source['Parent_Id'], errors = 'coerce').fillna(-1)

df_p = df_source[df_source['Parent_Id'] == -1]
df_p.columns = pd.MultiIndex.from_product([[1],df_source.columns])

df = df_source.copy()
df.columns = pd.MultiIndex.from_product([[2],df_source.columns])

step = 2
while True:

df_p = df_p.merge(df, how = 'left', left_on = [(step-1,'MyID')], right_on = [(step,'Parent_Id')])

step+=1
df = df_source.copy()
df.columns = pd.MultiIndex.from_product([[step],df_source.columns])
if len(set(df_p[(step-1,'MyID')]).intersection(set(df[(step,'Parent_Id')]))) == 0: break


Out[1]:

1 2 3 4
Name Ancestor MyID Parent_Id Name Ancestor MyID Parent_Id Name Ancestor MyID Parent_Id Name Ancestor MyID Parent_Id
0 Adam 191 191 -1.0 Alfred 191 111 191.0 Tom 191 211 111.0 NaN NaN NaN NaN
1 Adam 191 191 -1.0 Alfred 191 111 191.0 Galie 191 209 111.0 NaN NaN NaN NaN
2 Adam 191 191 -1.0 Alfred 191 111 191.0 Marvela 191 101 111.0 Remo 434.0 200.0 101.0
3 Adam 191 191 -1.0 Alfred 191 111 191.0 Marvela 191 101 111.0 Armin 322.0 234.0 101.0

按步骤:

Out[1]:

1
Name Ancestor MyID Parent_Id
No
10 Adam 191 191 -1.0


Out[2]:

1 2
Name Ancestor MyID Parent_Id Name Ancestor MyID Parent_Id
0 Adam 191 191 -1.0 Alfred 191 111 191.0


Out[3]:

1 2 3
Name Ancestor MyID Parent_Id Name Ancestor MyID Parent_Id Name Ancestor MyID Parent_Id
0 Adam 191 191 -1.0 Alfred 191 111 191.0 Tom 191 211 111.0
1 Adam 191 191 -1.0 Alfred 191 111 191.0 Galie 191 209 111.0
2 Adam 191 191 -1.0 Alfred 191 111 191.0 Marvela 191 101 111.0

关于python - 使用pandas对分层数据[Parent->Child]树进行高效分组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58555225/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com