Python Pandas replica filas en el marco de datos

3 minutos de lectura

Python Pandas replica filas en el marco de datos
CCD

Si el marco de datos se parece a:

Store,Dept,Date,Weekly_Sales,IsHoliday
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

Y quiero duplicar filas con IsHoliday igual a VERDADERO, puedo hacer:

is_hol = df['IsHoliday'] == True
df_try = df[is_hol]
df=df.append(df_try*10)

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?

  • stackoverflow.com/questions/50788508/replicando-filas-en-pandas/…

    – U12-Adelante

    01 ene.

1641816450 242 Python Pandas replica filas en el marco de datos
carlos d

Puedes poner df_try dentro de una lista y luego haz lo que tienes en mente:

>>> df.append([df_try]*5,ignore_index=True)

    Store  Dept       Date  Weekly_Sales IsHoliday
0       1     1 2010-02-05      24924.50     False
1       1     1 2010-02-12      46039.49      True
2       1     1 2010-02-19      41595.55     False
3       1     1 2010-02-26      19403.54     False
4       1     1 2010-03-05      21827.90     False
5       1     1 2010-03-12      21043.39     False
6       1     1 2010-03-19      22136.64     False
7       1     1 2010-03-26      26229.21     False
8       1     1 2010-04-02      57258.43     False
9       1     1 2010-02-12      46039.49      True
10      1     1 2010-02-12      46039.49      True
11      1     1 2010-02-12      46039.49      True
12      1     1 2010-02-12      46039.49      True
13      1     1 2010-02-12      46039.49      True

Otra forma es usando la función concat():

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

Python Pandas replica filas en el marco de datos
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)

Puedes hacerlo en una línea:

df.append([df[df['IsHoliday'] == True]] * 5, ignore_index=True)

o

df.append([df[df['IsHoliday']]] * 5, ignore_index=True)

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):

df['IsHoliday'] = df['IsHoliday'].apply(lambda x: 5*[x] if (x == True) else x)

df.explode('IsHoliday', ignore_index=True)

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?

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
Privacidad