Pero, ¿hay una mejor manera de hacer esto, ya que necesito duplicar las filas de vacaciones 5 veces, y tengo que agregar 5 veces si uso la forma anterior?
import pandas as pd
In [603]: df = pd.DataFrame({'col1':list("abc"),'col2':range(3)},index = range(3))
In [604]: df
Out[604]:
col1 col2
0 a 0
1 b 1
2 c 2
In [605]: pd.concat([df]*3, ignore_index=True) # Ignores the index
Out[605]:
col1 col2
0 a 0
1 b 1
2 c 2
3 a 0
4 b 1
5 c 2
6 a 0
7 b 1
8 c 2
In [606]: pd.concat([df]*3)
Out[606]:
col1 col2
0 a 0
1 b 1
2 c 2
0 a 0
1 b 1
2 c 2
0 a 0
1 b 1
2 c 2
Esta es una vieja pregunta, pero dado que todavía aparece en la parte superior de mis resultados en Google, aquí hay otra forma.
import pandas as pd
import numpy as np
df = pd.DataFrame({'col1':list("abc"),'col2':range(3)},index = range(3))
Digamos que desea replicar las filas donde col1=”b”.
reps = [3 if val=="b" else 1 for val in df.col1]
df.loc[np.repeat(df.index.values, reps)]
Podrías reemplazar el 3 if val=="b" else 1 en la interpretación de la lista con otra función que podría devolver 3 si val==”b” o 4 si val==”c” y así sucesivamente, por lo que es bastante flexible.
Esto también replicará los valores del índice, ¿correcto?
– Rufus VS
18 sep.
No sé si lo estoy haciendo mal, pero esto es muy lento para mí.
– Groft
25 jul. 19 en 10:54
Esta forma más elegante también es bastante rápida para mí en comparación con el uso de .append(..). Mi caso de uso es simplemente replicar un marco de datos con una sola fila 1000 veces.
– kawingkelvin
18 nov. 19 a las 22:31
Groft
Agregar y concatenar suele ser lento en Pandas, por lo que recomiendo simplemente hacer una nueva lista de filas y convertirla en un marco de datos (a menos que agregue una sola fila o concatene algunos marcos de datos).
import pandas as pd
df = pd.DataFrame([
[1,1,'2010-02-05',24924.5,False],
[1,1,'2010-02-12',46039.49,True],
[1,1,'2010-02-19',41595.55,False],
[1,1,'2010-02-26',19403.54,False],
[1,1,'2010-03-05',21827.9,False],
[1,1,'2010-03-12',21043.39,False],
[1,1,'2010-03-19',22136.64,False],
[1,1,'2010-03-26',26229.21,False],
[1,1,'2010-04-02',57258.43,False]
], columns=['Store','Dept','Date','Weekly_Sales','IsHoliday'])
temp_df = []
for row in df.itertuples(index=False):
if row.IsHoliday:
temp_df.extend([list(row)]*5)
else:
temp_df.append(list(row))
df = pd.DataFrame(temp_df, columns=df.columns)
Otra alternativa a append() es reemplazar primero los valores de una columna por una lista de entradas y luego explode() (ya sea usando ignore_index=True o no, dependiendo de lo que quieras):
Lo bueno de este es que ya puedes usar la lista en el apply() llame para crear copias de filas con valores modificados en una columna, en caso de que quiera hacerlo más tarde de todos modos…
.
¿Ha sido útil esta solución?
Tu feedback nos ayuda a saber si la solución es correcta y está funcionando. De esta manera podemos revisar y corregir el contenido.
Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos.
Configurar y más información
stackoverflow.com/questions/50788508/replicando-filas-en-pandas/…
– U12-Adelante
01 ene.