Anexar coluna ao dataframe do pandas

104

Provavelmente é fácil, mas tenho os seguintes dados:

No quadro de dados 1:

index dat1
0     9
1     5

No quadro de dados 2:

index dat2
0     7
1     6

Quero um quadro de dados com o seguinte formato:

index dat1  dat2
0     9     7
1     5     6

Tentei usar o appendmétodo, mas recebo uma junção cruzada (ou seja, produto cartesiano).

Qual é a maneira certa de fazer isso?

BenDundee
fonte
2
Você tentou o joinmétodo?
BrenBarn
1
data_frame_1 ['dat2'] = data_frame_2 ['dat2']
lowtech
@lowtech: isso garante que os índices sejam combinados corretamente?
BenDundee
@BenDundee: sim, tem
lowtech

Respostas:

132

Em geral, parece que você está apenas procurando uma associação:

> dat1 = pd.DataFrame({'dat1': [9,5]})
> dat2 = pd.DataFrame({'dat2': [7,6]})
> dat1.join(dat2)
   dat1  dat2
0     9     7
1     5     6
U2EF1
fonte
45
Ou pd.concat([dat1, dat2], axis=1)neste caso.
DSM
2
@BenDundee Join e concat usam muito do mesmo código por baixo do capô, então a maneira "certa" provavelmente só importa quando você considera casos extremos. Por exemplo, aqui se ambos os DataFrames tivessem uma coluna de 'dados', a junção falharia , enquanto um concat forneceria duas colunas chamadas 'dados'.
U2EF1
@ U2EF1: Eu estava falando sobre a sua resposta contra a minha. Sempre há N maneiras de
tirar
@BenDundee entendo. Esse método descarta o índice exclusivo e tem efeitos colaterais ainda mais estranhos em casos mais complicados. Por exemplo, se eu tivesse duas colunas chamadas 'dados', agrupar / somar começaria a somar as diferentes colunas de dados, o que quase certamente não é o que você deseja. Os dados da string seriam concatenados.
U2EF1
1
Como apontado por @ jeremy-z, é muito importante redefinir os índices em ambos os conjuntos de dados se eles não compartilharem o mesmo índice. Caso contrário, você obterá um conjunto de dados com muitas linhas NaNs.
Israel Varea
57

Você também pode usar:

dat1 = pd.concat([dat1, dat2], axis=1)
Ella Cohen
fonte
1
Caso encontre InvalidIndexError: Reindexing only valid with uniquely valued Index objects , você pode usar:pd.concat([dat1.reset_index(), dat2], axis=1)
beyondfloatingpoint
40

Ambos join()e concat()forma poderia resolver o problema. No entanto, há um aviso que devo mencionar: redefina o índice antes de você join()ou concat()se estiver tentando lidar com algum quadro de dados selecionando algumas linhas de outro DataFrame.

Um exemplo abaixo mostra alguns comportamentos interessantes de join e concat:

dat1 = pd.DataFrame({'dat1': range(4)})
dat2 = pd.DataFrame({'dat2': range(4,8)})
dat1.index = [1,3,5,7]
dat2.index = [2,4,6,8]

# way1 join 2 DataFrames
print(dat1.join(dat2))
# output
   dat1  dat2
1     0   NaN
3     1   NaN
5     2   NaN
7     3   NaN

# way2 concat 2 DataFrames
print(pd.concat([dat1,dat2],axis=1))
#output
   dat1  dat2
1   0.0   NaN
2   NaN   4.0
3   1.0   NaN
4   NaN   5.0
5   2.0   NaN
6   NaN   6.0
7   3.0   NaN
8   NaN   7.0

#reset index 
dat1 = dat1.reset_index(drop=True)
dat2 = dat2.reset_index(drop=True)
#both 2 ways to get the same result

print(dat1.join(dat2))
   dat1  dat2
0     0     4
1     1     5
2     2     6
3     3     7


print(pd.concat([dat1,dat2],axis=1))
   dat1  dat2
0     0     4
1     1     5
2     2     6
3     3     7
Jeremy Z
fonte
Bem dito e bom ponto. Tentei sem redefinir o índice e gerei muitos NULLS
Anand
Sem fazer a etapa de redefinição, meus dados pareciam bons e bons, mas obviamente algo não funcionou bem nos bastidores. Obrigado por apontar isso! A reinicialização colocou meu modelo em funcionamento!
Ionuț Ciuta
Esta deve ser a resposta aceita! Ele sempre gera NaNs se não zerarmos o índice.
Srivatsan
Essa etapa me salvou. Eu estava tentando entender por que concat e join estavam gerando muitos NaNs. Obrigado por compartilhar isso.
Gustavo Rottgering
0

Para falar a verdade:

data_joined = dat1.join(dat2)
print(data_joined)
Raj Stha
fonte
-3

Basta fazer a pesquisa certa no Google:

data = dat_1.append(dat_2)
data = data.groupby(data.index).sum()
BenDundee
fonte