Eu tenho 3 arquivos CSV. Cada um tem a primeira coluna como o nome (string) das pessoas, enquanto todas as outras colunas em cada dataframe são atributos dessa pessoa.
Como posso "unir" todos os três documentos CSV para criar um único CSV com cada linha tendo todos os atributos para cada valor exclusivo do nome da string da pessoa?
A join()
função no pandas especifica que eu preciso de um índice múltiplo, mas estou confuso sobre o que um esquema de indexação hierárquica tem a ver com a criação de uma junção com base em um único índice.
df1.join([df2, df3], on=[df2_col1, df3_col1])
não funcionou.Respostas:
Importações assumidas:
A resposta de John Galt é basicamente uma
reduce
operação. Se eu tiver mais do que um punhado de quadros de dados, eu os colocaria em uma lista como esta (gerada através de compreensões ou loops de lista ou outros enfeites):Supondo que eles tenham alguma coluna em comum, como
name
no seu exemplo, eu faria o seguinte:Dessa forma, seu código deve funcionar com qualquer número de quadros de dados que você deseja mesclar.
Editar 1 de agosto de 2016 : Para aqueles que usam Python 3:
reduce
foi movido parafunctools
. Portanto, para usar esta função, primeiro você precisará importar esse módulo:fonte
reduce
foi substituídofunctools.reduce
Entãoimport functools functools.reduce(.......)
name1
,name2
ename3
respectivamente.n-1
chamadas para a função de mesclagem? Acho que nesse caso em que o número de quadros de dados é pequeno, não importa, mas me pergunto se há uma solução mais escalável.df
s com vários índices da coluna (estava injetando o 'on' como uma coluna que funcionava para a primeira mesclagem, mas as fusões subsequentes falharam); em vez disso, consegui trabalhar com:df = reduce(lambda left, right: left.join(right, how='outer', on='Date'), dfs)
Você pode tentar isso se tiver 3 quadros de dados
alternativamente, como mencionado por cwharland
fonte
df1.merge(df2,on='name').merge(df3,on='name')
name1
,name2
ename3
respectivamentedf1.merge(df2,left_on='name1', right_on='name2').merge(df3,left_on='name1', right_on='name3').drop(columns=['name2', 'name3']).rename(columns={'name1':'name'})
Esta é uma situação ideal para o
join
métodoo
join
método é criado exatamente para esses tipos de situações. Você pode associar qualquer número de DataFrames a ele. O DataFrame chamador se junta ao índice da coleção de DataFrames passados. Para trabalhar com vários DataFrames, você deve colocar as colunas de junção no índice.O código ficaria assim:
Com os dados de @ zero, você pode fazer o seguinte:
fonte
pd.DataFrame().join(dfs, how="outer")
. Isso pode ser mais limpo em algumas situações.pd.concat
resultará em sintaxe mais simples:pd.concat([df.set_index('name') for df in dfs], axis=1, join='inner').reset_index()
.concat
também é mais versátil ao lidar com nomes de colunas duplicados em vários dfs (join
não é tão bom nisso), embora você possa executar uniões internas ou externas apenas com ela.dfs[0].join(dfs[1:])
deve ser editado para,dfs[0].join(dfs[1:], sort=False)
caso contrário, umFutureWarning
irá aparecer. Obrigado pelo bom exemplo.ValueError: Indexes have overlapping values
embora, pela inspeção dos quadros de dados individuais na lista, eles não pareçam ter valores sobrepostos.Isso também pode ser feito da seguinte maneira para obter uma lista de quadros de dados
df_list
:ou se os quadros de dados estiverem em um objeto gerador (por exemplo, para reduzir o consumo de memória):
fonte
No
python
3.6.3 compandas
0.22.0, você também pode usarconcat
, desde que você defina como índice, as colunas que deseja usar para a associaçãoonde
df1
,,df2
edf3
são definidos como na resposta de John Galtfonte
Não é necessário um multi-índice para executar operações de junção . Basta definir corretamente a coluna do índice na qual executar as operações de junção (que comandam
df.set_index('Name')
por exemplo)A
join
operação é executada por padrão no índice. No seu caso, você apenas precisa especificar que aName
coluna corresponde ao seu índice. Abaixo está um exemploUm tutorial pode ser útil.
fonte
Aqui está um método para mesclar um dicionário de quadros de dados enquanto mantém os nomes das colunas sincronizados com o dicionário. Também preenche os valores ausentes, se necessário:
Esta é a função para mesclar um ditado de quadros de dados
OK, vamos gerar dados e testar isso:
fonte
Solução Simples:
Se os nomes das colunas forem semelhantes:
Se os nomes das colunas forem diferentes:
fonte
Existe outra solução na documentação do pandas (que não vejo aqui),
usando o
.append
o
ignore_index=True
é usado para ignorar o índice do quadro de dados anexado, substituindo-o pelo próximo índice disponível no de origem.Se houver nomes de colunas diferentes,
Nan
será apresentado.fonte
Os três quadros de dados são
Vamos mesclar esses quadros usando o pd.merge aninhado
Aqui vamos nós, temos nosso dataframe mesclado.
Feliz análise !!!
fonte