<p><a href="https://i.stack.imgur.com/oELbb.png" rel="nofollow noreferrer"><img src="https://i.stack.imgur.com/oELbb.png" alt="enter image description here"/></a></p>
<pre><code>import pandas as pd
import numpy as np
df = pd.DataFrame({
"child": ['A','B','C','D','E','F','G','H','I','A1','B1','C1','D1','E1','F1','G1','H1','I1'],
"parent": [np.NaN,'A','A','B','B','C','C','G','G',np.NaN,'A1','A1','B1','B1','C1','C1','G1','G1']
})
</code></pre>
<pre><code>upper_parent_list = list(df[df['parent'].isna()]['child'])
['A', 'A1']
</code></pre>
<pre><code>df['upper_parent'] = df['parent'].fillna(df['child'])
child parent upper_parent
0 A NaN A
1 B A A
2 C A A
3 D B B
4 E B B
5 F C C
6 G C C
7 H G G
8 I G G
9 A1 NaN A1
10 B1 A1 A1
11 C1 A1 A1
12 D1 B1 B1
13 E1 B1 B1
14 F1 C1 C1
15 G1 C1 C1
16 H1 G1 G1
17 I1 G1 G1
</code></pre>
<pre><code>while df['upper_parent'].isin(upper_parent_list).sum()!=df.shape[0]:
for up_par in upper_parent_list:
child_list = list(df[df['upper_parent'].isin([up_par])]['child'])
df['upper_parent'] = np.where(df['parent'].isin(child_list), up_par, df['upper_parent'])
print(df)
child parent upper_parent
0 A NaN A
1 B A A
2 C A A
3 D B A
4 E B A
5 F C A
6 G C A
7 H G A
8 I G A
9 A1 NaN A1
10 B1 A1 A1
11 C1 A1 A1
12 D1 B1 A1
13 E1 B1 A1
14 F1 C1 A1
15 G1 C1 A1
16 H1 G1 A1
17 I1 G1 A1
</code></pre>