Tengo un marco de datos donde cada fila contiene varios metadatos relacionados con un solo comentario de Reddit (por ejemplo, autor, subreddit, texto de comentario).
Quiero hacer lo siguiente: para cada autor, quiero obtener una lista de todos los subreddits en los que tienen comentarios y transformar estos datos en un marco de datos de pandas donde cada fila corresponde a un autor y una lista de todos los subreddits únicos. comentan en.
Actualmente estoy intentando alguna combinación de lo siguiente, pero no puedo bajarlo:
Intento 1:
group = df['subreddit'].groupby(df['author']).unique() list(group)Intento 2:
from collections import defaultdict subreddit_dict = defaultdict(list) for index, row in df.iterrows(): author = row['author'] subreddit = row['subreddit'] subreddit_dict[author].append(subreddit) for key, value in subreddit_dict.items(): subreddit_dict[key] = set(value) subreddit_df = pd.DataFrame.from_dict(subreddit_dict, orient = 'index')Aquí hay dos estrategias para hacerlo. Sin duda, hay otras formas.
Suponiendo que su marco de datos se vea así (obviamente con más columnas):
df = pd.DataFrame({'author':['a', 'a', 'b'], 'subreddit':['sr1', 'sr2', 'sr2']}) >>> df author subreddit 0 a sr1 1 a sr2 2 b sr2 ...SOLUCIÓN 1: agrupar por
Más sencillo que la solución 2 y similar a su primer intento:
group = df.groupby('author') df2 = group.apply(lambda x: x['subreddit'].unique()) # Alternatively, same thing as a one liner: # df2 = df.groupby('author').apply(lambda x: x['subreddit'].unique())Resultado:
>>> df2 author a [sr1, sr2] b [sr2]El autor es el índice, y la única columna es la lista de todos los subreddits en los que están activos (así es como interpreté cómo querías tu salida, de acuerdo con tu descripción).
Si quisiera los subreddits cada uno en una columna separada, que podría ser más útil, dependiendo de lo que quiera hacer con él, podría hacer esto después:
df2 = df2.apply(pd.Series)Resultado:
>>> df2 0 1 author a sr1 sr2 b sr2 NaNSolución 2: iterar a través del marco de datos
puede crear un nuevo marco de datos con todos los autores únicos:
df2 = pd.DataFrame({'author':df.author.unique()})Y luego obtenga la lista de todos los subreddits únicos en los que están activos, asignándolos a una nueva columna:
df2['subreddits'] = [list(set(df['subreddit'].loc[df['author'] == x['author']])) for _, x in df2.iterrows()]Esto te da esto:
>>> df2 author subreddits 0 a [sr2, sr1] 1 b [sr2]Mediante el uso de datos de muestra de sacul
df['subreddit'].groupby(df['author']).unique().apply(pd.Series) Out[370]: 0 1 author a sr1 sr2 b sr2 NaNUsando la función groupby.agg() "agggeate":
*
DataFrameGroupBy.agg(arg, *args, **kwargs): agregado usando una o más operaciones sobre el eje especificado. Función que se utilizará para agregar los datos. Si es una función, debe funcionar cuando se pasa un DataFrame o cuando se pasa a DataFrame.apply
df = pd.DataFrame({'numbers': [1, 2, 3, 6, 9], 'colors': ['red', 'white', 'blue', 'red', 'white']}, columns=['numbers', 'colors']) df.groupby('colors', as_index=True).agg({'numbers' : {"unique" : lambda x: set(x), "nunique" : lambda x : len(set(x))}})