Los pandas de Python avanzados remodelan

Creo que esto es similar a esta publicación pero no exactamente igual y no puedo entenderlo.

Por lo tanto, actualmente tengo un dataframe de pandas (bastante extraño) con listas en cada celda como esta:

>>> data = pd.DataFrame({'myid' : ['1', '2', '3'], 'num' : [['1', '2', '3'], ['1', '2'], []], 'text' : [['aa', 'bb', 'cc'], ['cc', 'dd'], []]}).set_index('myid') >>> print(data) num text myid 1 [1, 2, 3] [aa, bb, cc] 2 [1, 2] [cc, dd] 3 [] [] 

Me gustaría lograr esto:

  myid num text 0 1 1 aa 0 1 2 bb 0 1 3 cc 1 2 1 cc 1 2 2 dd 2 3 

¿Como llego hasta ahí?

    str.len para determinar longitudes de listas / arrays integrados. Luego usa repeat y concatenate

     lens = df.num.str.len() pd.DataFrame(dict( myid=df.myid.repeat(lens), num=np.concatenate(df.num), text=np.concatenate(df.text) )).append( pd.DataFrame( df.loc[~df.num.astype(bool), 'myid'] ) ).fillna('') myid num text 0 1 1 aa 0 1 2 bb 0 1 3 cc 1 2 1 cc 1 2 2 dd 2 3 

    Intenté aquí crear una solución un poco más genérica basada en la solución de bright @ piRSquared :

    Marco de datos:

     df = pd.DataFrame({ 'aaa': {0: 10, 1: 11, 2: 12, 3: 13}, 'myid': {0: 1, 1: 2, 2: 3, 3: 4}, 'num': {0: [1, 2, 3], 1: [1, 2], 2: [], 3: []}, 'text': {0: ['aa', 'bb', 'cc'], 1: ['cc', 'dd'], 2: [], 3: []} }) 

    Solución:

     lst_cols = ['num','text'] idx_cols = df.columns.difference(lst_cols) lens = df[lst_cols[0]].str.len() pd.DataFrame({ col:np.repeat(df[col].values, df[lst_cols[0]].str.len()) for col in idx_cols }).assign(**{col:np.concatenate(df[col].values) for col in lst_cols}) \ .append(df.loc[lens==0, idx_cols]).fillna('') \ .loc[:, df.columns] 

    Fuente DF:

     In [25]: df Out[25]: aaa myid num text 0 10 1 [1, 2, 3] [aa, bb, cc] 1 11 2 [1, 2] [cc, dd] 2 12 3 [] [] 3 13 4 [] [] 

    Resultado:

     In [26]: pd.DataFrame({ ...: col:np.repeat(df[col].values, df[lst_cols[0]].str.len()) ...: for col in idx_cols ...: }).assign(**{col:np.concatenate(df[col].values) for col in lst_cols}) \ ...: .append(df.loc[lens==0, idx_cols]).fillna('') \ ...: .loc[:, df.columns] ...: Out[26]: aaa myid num text 0 10 1 1 aa 1 10 1 2 bb 2 10 1 3 cc 3 11 2 1 cc 4 11 2 2 dd 2 12 3 3 13 4