Eu tenho dois dataframes do pandas:
from pandas import DataFrame
df1 = DataFrame({'col1':[1,2],'col2':[3,4]})
df2 = DataFrame({'col3':[5,6]})
Qual é a prática recomendada para obter seu produto cartesiano (claro, sem escrever explicitamente como eu)?
#df1, df2 cartesian product
df_cartesian = DataFrame({'col1':[1,2,1,2],'col2':[3,4,3,4],'col3':[5,5,6,6]})
Use
pd.MultiIndex.from_product
como um índice em um dataframe vazio, em seguida, redefina seu índice e pronto.Fora:
fonte
df1.col1
edf.col2
).from_product
possa ser usado para esse problema.Isso não vencerá uma competição de golfe de código e se baseia nas respostas anteriores - mas mostra claramente como a chave é adicionada e como funciona a junção. Isso cria 2 novos quadros de dados de listas e adiciona a chave para fazer o produto cartesiano.
Meu caso de uso era que eu precisava de uma lista de todos os IDs de loja para cada semana em minha lista. Então, criei uma lista de todas as semanas que queria ter e, em seguida, uma lista de todos os IDs de loja com os quais queria mapeá-los.
A mesclagem que escolhi à esquerda, mas seria semanticamente igual à interna nesta configuração. Você pode ver isso na documentação sobre fusão , que afirma que é um produto cartesiano se a combinação de teclas aparecer mais de uma vez em ambas as tabelas - que é o que configuramos.
fonte
days_and_stores = pd.merge(days.assign(key=0), stores.assign(key=0), on='key').drop('key', axis=1)
Código mínimo necessário para este. Crie uma 'chave' comum para mesclar os dois cartesianos:
fonte
df_cartesian = df_cartesian.drop(columns=['key'])
para limpar no finalCom encadeamento de métodos:
fonte
Como alternativa, pode-se contar com o produto cartesiano proporcionado pelos itertools:,
itertools.product
que evita criar uma chave temporária ou modificar o índice:Teste rápido:
fonte
Se você não tem colunas sobrepostas, não deseja adicionar uma, e os índices dos frames de dados podem ser descartados, isso pode ser mais fácil:
fonte
TypeError: '<class 'pandas.core.index.Int64Index'>' does not support mutable operations.
posso contornar isso adicionando, index=[0,0]
à definição de dataframe.df1 = df1.set_index([[0]*len(df1)]))
(e da mesma forma paradf2
).Aqui está uma função auxiliar para realizar um produto cartesiano simples com dois quadros de dados. A lógica interna lida com uma chave interna e evita mutilar quaisquer colunas que sejam chamadas de "chave" de qualquer um dos lados.
mostra:
fonte
Você poderia começar pegando o produto cartesiano de
df1.col1
edf2.col3
, em seguida, mesclar novamentedf1
para obtercol2
.Aqui está uma função geral do produto cartesiano que possui um dicionário de listas:
Aplicar como:
fonte
Você pode usar numpy, pois poderia ser mais rápido. Suponha que você tenha duas séries como segue,
Você só precisa,
fonte
Acho que usar o pandas MultiIndex é a melhor ferramenta para o trabalho. Se você tiver uma lista de listas
lists_list
, chamepd.MultiIndex.from_product(lists_list)
e itere sobre o resultado (ou use-o no índice DataFrame).fonte