how to change the iterrows method to apply

Solution 1:

Are you expect something like that:

>>> df.join(df['routes'].explode().rename('Broken_Route')) \
      .assign(**{'Route Number': lambda x: x.groupby(level=0).cumcount().add(1)})

                   routes  route_count Broken_Route  Route Number
0             [[CHN-IND]]            1    [CHN-IND]             1
1  [[CHN-IND], [IND-KOR]]            2    [CHN-IND]             1
1  [[CHN-IND], [IND-KOR]]            2    [IND-KOR]             2
2                                    0                          1

Setup:

data = {'routes': [[['CHN-IND']], [['CHN-IND'], ['IND-KOR']], ''], 
        'route_count': [1, 2, 0]}
df = pd.DataFrame(data)

Update 1: added a record with route_count=0 and routes=''.

Solution 2:

You can assign the routes and counts and explode:

(df.assign(Broken_Route=df['routes'],
           count=df['routes'].str.len().apply(range))
   .explode(['Broken_Route', 'count'])
)

NB. multi-column explode requires pandas ≥1.3.0, if older use this method

output:

                   routes  route_count Broken_Route count
0             [[CHN-IND]]            1    [CHN-IND]     0
1  [[CHN-IND], [IND-KOR]]            2    [CHN-IND]     0
1  [[CHN-IND], [IND-KOR]]            2    [IND-KOR]     1