Tengo un DataFrame de pandas que se parece a esto

string count values
----
string1 3 vals1
string2 2 vals2

Y quiero deshacerme de la columna "contar" repitiendo cada fila "contar" veces para obtener un DataFrame como este

string1 vals1
string1 vals1
string1 vals1
string2 vals2
string2 vals2

¿Hay una receta fácil de Pandas para esta operación?

1
Yaroslav Bulatov 10 dic. 2015 a las 07:39

3 respuestas

La mejor respuesta

No estoy seguro si hay una mejor forma nativa, pero podría hacer algo como

>>> df.iloc[np.repeat(np.arange(len(df)), df["count"])]
    string  count values
0  string1      3  vals1
0  string1      3  vals1
0  string1      3  vals1
1  string2      2  vals2
1  string2      2  vals2

Para obtener algo para comenzar, y luego elimine el conteo y (si lo desea) reset_index(drop=True).

1
DSM 10 dic. 2015 a las 05:14

No creo que haya una manera fácil de hacer esto (como en una función). Aquí hay una solución alternativa que crea una lista anidada que luego se usa para recrear el marco de datos extendido.

# Sample data.
df = pd.DataFrame({'string': ['string1', 'string2'], 'count': [3, 2], 'values': ['vals1', 'vals2']})
>>> df
   count   string values
0      3  string1  vals1
1      2  string2  vals2

# Use nested list comprehension to repeat selected columns of each row `count` times.
df2 = pd.DataFrame([[row['string'], row['values']]
                     for _, row in df.iterrows() 
                     for _ in range(row['count'])],
                   columns=['string', 'values'])

>>> df2
    string values
0  string1  vals1
1  string1  vals1
2  string1  vals1
3  string2  vals2
4  string2  vals2
1
Alexander 10 dic. 2015 a las 05:03

Tratar:

Df.groupby (['string', 'values']). apply (lambda x: pd.concat ([x] * sum (x ['count']))). reset_index (drop = True)

Suponiendo que desea la suma en casos de más de una línea de conteo.

1
Ezer K 10 dic. 2015 a las 11:00