Tengo un marco de datos en pandas como se menciona a continuación, donde los elementos en la info de la columna son los mismos que el archivo único en la id de la columna:
id text info 1 great boy,police 1 excellent boy,police 2 nice girl,mother,teacher 2 good girl,mother,teacher 2 bad girl,mother,teacher 3 awesome grandmother 4 superb grandsonTodo lo que quiero obtener elementos de la lista como fila para cada archivo, como:
id text info 1 great boy 1 excellent police 2 nice girl 2 good mother 2 bad teacher 3 awesome grandmother 4 superb grandsonUna forma de usar pandas.DataFrame.groupby.transform .
Tenga en cuenta que esto supone:
info tienen la misma longitud que el número de miembros para cada id después de dividirlos por ','info son idénticos entre la misma identificación. df["info"] = df.groupby("id")["info"].transform(lambda x: x.str.split(",").iloc[0]) print(df)Producción:
id text info 0 1 great boy 1 1 excellent police 2 2 nice girl 3 2 good mother 4 2 bad teacher 5 3 awesome grandmother 6 4 superb grandsoncree una variable temporal contando el número de filas para cada grupo de info :
temp = df.groupby('info').cumcount() Haga una lista de comprensión para indexar por texto en info :
df['info'] = [ent.split(',')[pos] for ent, pos in zip(df['info'], temp)] df id text info 0 1 great boy 1 1 excellent police 2 2 nice girl 3 2 good mother 4 2 bad teacher 5 3 awesome grandmother 6 4 superb grandsonO intente apply :
df['info'] = pd.DataFrame({'info': df['info'].str.split(','), 'n': df.groupby('id').cumcount()}).apply(lambda x: x['info'][x['n']], axis=1)Producción:
>>> df id text info 0 1 great boy 1 1 excellent police 2 2 nice girl 3 2 good mother 4 2 bad teacher 5 3 awesome grandmother 6 4 superb grandson >>>Intentemos
df['new'] = df.loc[~df.id.duplicated(),'info'].str.split(',').explode().values df id text info new 0 1 great boy,police boy 1 1 excellent boy,police police 2 2 nice girl,mother,teacher girl 3 2 good girl,mother,teacher mother 4 2 bad girl,mother,teacher teacher 5 3 awesome grandmother grandmother 6 4 superb grandson grandsonAproveche el hecho de que 'info' está duplicada.
df['info'] = df['info'].drop_duplicates().str.split(',').explode().to_numpy()Producción:
id text info 0 1 great boy 1 1 excellent police 2 2 nice girl 3 2 good mother 4 2 bad teacher 5 3 awesome grandmother 6 4 superb grandson