Tengo dos marcos de datos de pandas:
from pandas import DataFrame
df1 = DataFrame({'col1':[1,2],'col2':[3,4]})
df2 = DataFrame({'col3':[5,6]})
¿Cuál es la mejor práctica para obtener su producto cartesiano (por supuesto, sin escribirlo explícitamente como yo)?
#df1, df2 cartesian product
df_cartesian = DataFrame({'col1':[1,2,1,2],'col2':[3,4,3,4],'col3':[5,5,6,6]})
Úselo
pd.MultiIndex.from_product
como un índice en un marco de datos que de otra manera estaría vacío, luego restablezca su índice y listo.fuera:
fuente
df1.col1
ydf.col2
).from_product
pueda usarse para este problema.Esto no ganará una competencia de golf de código y se basa en las respuestas anteriores, pero muestra claramente cómo se agrega la clave y cómo funciona la combinación. Esto crea 2 nuevos marcos de datos a partir de listas, luego agrega la clave para hacer el producto cartesiano.
Mi caso de uso fue que necesitaba una lista de todos los ID de tienda para cada semana en mi lista. Entonces, creé una lista de todas las semanas que quería tener, luego una lista de todas las ID de tienda con las que quería asignarlas.
La combinación que elegí a la izquierda, pero sería semánticamente la misma que la interior en esta configuración. Puede ver esto en la documentación sobre la fusión , que establece que hace un producto cartesiano si la combinación de teclas aparece más de una vez en ambas tablas, que es lo que configuramos.
fuente
days_and_stores = pd.merge(days.assign(key=0), stores.assign(key=0), on='key').drop('key', axis=1)
Se necesita un código mínimo para este. Cree una 'clave' común para fusionar los dos cartesianos:
fuente
df_cartesian = df_cartesian.drop(columns=['key'])
para limpiar al finalCon encadenamiento de métodos:
fuente
Como alternativa, se puede confiar en el producto cartesiano proporcionado por itertools:,
itertools.product
que evita crear una clave temporal o modificar el índice:Examen rápido:
fuente
Si no tiene columnas superpuestas, no desea agregar una y los índices de los marcos de datos se pueden descartar, esto puede ser más fácil:
fuente
TypeError: '<class 'pandas.core.index.Int64Index'>' does not support mutable operations.
puedo evitar esto agregando, index=[0,0]
a la definición del marco de datos.df1 = df1.set_index([[0]*len(df1)]))
(y de manera similar paradf2
).Aquí hay una función auxiliar para realizar un producto cartesiano simple con dos marcos de datos. La lógica interna maneja el uso de una clave interna y evita alterar cualquier columna que se llame "clave" de cualquier lado.
muestra:
fuente
Puede comenzar tomando el producto cartesiano de
df1.col1
ydf2.col3
, luego fusionar de nuevo condf1
para obtenercol2
.Aquí hay una función de producto cartesiana general que toma un diccionario de listas:
Aplicar como:
fuente
Puedes usar numpy ya que podría ser más rápido. Suponga que tiene dos series como sigue,
Solo necesitas,
fuente
Encuentro que usar pandas MultiIndex es la mejor herramienta para el trabajo. Si tiene una lista de listas
lists_list
, llamepd.MultiIndex.from_product(lists_list)
e itere sobre el resultado (o utilícelo en el índice DataFrame).fuente