Tengo un marco de datos de pandas sin clasificar extremadamente grande (más de dos millones de filas) con múltiples columnas, dos columnas de las cuales identifican a qué categoría pertenecen estas filas. Donde la combinación de "K" y "U" representan una categoría única para estas filas, quiero seleccionar todas las filas que caen en cada una de estas categorías y almacenar estas filas como marcos de datos separados que se pueden manipular y analizar más adelante para modelos de aprendizaje automático. Dejame explicar

'a' 'b' 'c' 'K' 'U' 'd'
------------------------
aaa bbb ccc 2245 23 ddd
avd bad cec 2245 23 dwq
avd bad cec 2646 23 dwq
avd bad cec 1621 23 dwq
avd bad cec 1621 26 dwq

Las dos filas superiores tienen el mismo valor "K" y "U" , así que quiero que se almacenen juntas, sin embargo, las otras filas pertenecen a categorías diferentes por completo debido a que tienen una combinación diferente de K y U , por lo que estos se almacenarán en un marco de datos separado.

Mi primera "solución" para esto usó un bucle for para iterar a través de la K del marco de datos, creando un nuevo marco de datos que encapsulara cada fila que contiene la K única y haciendo otro bucle for para cada U en este nuevo marco de datos K . Luego creé un segundo marco de datos en este ciclo que contiene todas las filas con esta U actual. Este enfoque no funciona como se esperaba, pero siento que estaba cerca de una solución al problema. Es insoportablemente lento en el marco de datos completo, y se agradecería una solución más rápida y adecuada. ¿Cómo haría esto de una manera adecuada y más eficiente?

-1
Ribbreaker - 6 dic. 2020 a las 13:24

2 respuestas

La mejor respuesta

Puedes hacerlo de esta manera:

         c     K   U    d
     0  aaa  2245  23  ddd
     1  avd  2245  23  dwq
     2  avd  2646  23  dwq
     3  avd  1621  23  dwq
     4  avd  1621  26  dwq 

grouped_df = dataframe.groupby(['K','U'])
for key,df in grouped_df:
  print('\n',key,'\n',df.head())

(1621, 23) 
      c     K   U    d
  3  avd  1621  23  dwq

(1621, 26) 
      c     K   U    d
  4  avd  1621  26  dwq

(2245, 23) 
      c     K   U    d
  0  aaa  2245  23  ddd
  1  avd  2245  23  dwq

(2646, 23) 
      c     K   U    d
  2  avd  2646  23  dwq

De esta manera, tiene n marcos de datos diferentes con el mismo valor de par de 'K' y 'U'. Después de agrupar, puede acceder al marco de datos único utilizando el método get_group que proporciona la clave como:

df_n=grouped_df.get_group((2245, 23))

(2245, 23) 
      c     K   U    d
  0  aaa  2245  23  ddd
  1  avd  2245  23  dwq
0
Sunny 6 dic. 2020 a las 10:45

Puede usar duplicated, especificar un subset de las columnas clave y pasar keep=False. Luego, coloque todo esto dentro de df[] para filtrar esas filas:

df[df.duplicated(subset=['K', 'U'], keep=False)]

    a   b   c   K       U   d
0   aaa bbb ccc 2245    23  ddd
1   avd bad cec 2245    23  dwq

Para el otro marco de datos, simplemente agregue un ~ al frente:

df[~df.duplicated(subset=['K', 'U'], keep=False)]

    a   b   c   K       U   d
2   avd bad cec 2646    23  dwq
3   avd bad cec 1621    23  dwq
4   avd bad cec 1621    26  dwq
0
David Erickson 6 dic. 2020 a las 10:38