Combinando duas séries em um DataFrame em pandas

278

Eu tenho duas séries s1e s2com os mesmos índices (não consecutivos). Como combinar s1e s2ser duas colunas em um DataFrame e manter um dos índices como uma terceira coluna?

user7289
fonte

Respostas:

417

Eu acho que concaté uma boa maneira de fazer isso. Se estiverem presentes, ele usa os atributos de nome da série como colunas (caso contrário, simplesmente os numera):

In [1]: s1 = pd.Series([1, 2], index=['A', 'B'], name='s1')

In [2]: s2 = pd.Series([3, 4], index=['A', 'B'], name='s2')

In [3]: pd.concat([s1, s2], axis=1)
Out[3]:
   s1  s2
A   1   3
B   2   4

In [4]: pd.concat([s1, s2], axis=1).reset_index()
Out[4]:
  index  s1  s2
0     A   1   3
1     B   2   4

Nota: Isso se estende a mais de 2 séries.

Andy Hayden
fonte
5
isso realmente evita copiar também (em comparação com a solução dict)
Jeff
Em um exemplo, parece estar me dizendo 'ValueError: O valor verdadeiro de uma matriz com mais de um elemento é ambíguo. Use a.any () ou a.all () '- alguma idéia?
User7289
@ user7289 não sabe de onde viria, você poderia fazer isso como outra pergunta?
Andy Hayden
@ AndyHayden: e se houver duplicatas ao longo de um ou dos dois índices?
Mannaggia
2
@dafinguzman O que significa "reutilizar constantemente essa função" é que você deve preferir fazer o concat uma vez pd.concat([list_of_dataframes]) e concorrer várias vezes new_df = pd.DataFrame(); for df in list_of_dsf: new_df = pd.concat([new_df, df])ou similar.
Andy Hayden
38

Por que você não usa apenas .to_frame se ambos têm os mesmos índices?

> = v0.23

a.to_frame().join(b)

< v0.23

a.to_frame().join(b.to_frame())
swmfg
fonte
4
Talvez isso seja mais apropriado: a.to_frame (name = 'a'). Join (b.to_frame (name = 'b'))
#
33

Os pandas alinham automaticamente os passados ​​em série e criam o índice conjunto. Eles são os mesmos aqui. reset_indexmove o índice para uma coluna.

In [2]: s1 = Series(randn(5),index=[1,2,4,5,6])

In [4]: s2 = Series(randn(5),index=[1,2,4,5,6])

In [8]: DataFrame(dict(s1 = s1, s2 = s2)).reset_index()
Out[8]: 
   index        s1        s2
0      1 -0.176143  0.128635
1      2 -1.286470  0.908497
2      4 -0.995881  0.528050
3      5  0.402241  0.458870
4      6  0.380457  0.072251
Jeff
fonte
16

Código de exemplo:

a = pd.Series([1,2,3,4], index=[7,2,8,9])
b = pd.Series([5,6,7,8], index=[7,2,8,9])
data = pd.DataFrame({'a': a,'b':b, 'idx_col':a.index})

O Pandas permite criar um DataFramede a dictcom Seriescomo valores e nomes de colunas como chaves. Quando encontra a Seriescomo valor, usa o Seriesíndice como parte do DataFrameíndice. Esse alinhamento de dados é uma das principais vantagens do Pandas. Consequentemente, a menos que você tenha outras necessidades, o recém-criado DataFramepossui um valor duplicado. No exemplo acima, data['idx_col']possui os mesmos dados que data.index.

jbn
fonte
13

Se eu puder responder isso.

Os fundamentos por trás da conversão de séries em quadro de dados é entender que

1. No nível conceitual, cada coluna no quadro de dados é uma série.

2. E todo nome de coluna é um nome de chave que é mapeado para uma série.

Se você mantiver acima de dois conceitos em mente, poderá pensar em várias maneiras de converter séries em quadros de dados. Uma solução fácil será assim:

Crie duas séries aqui

import pandas as pd

series_1 = pd.Series(list(range(10)))

series_2 = pd.Series(list(range(20,30)))

Crie um quadro de dados vazio com apenas os nomes de coluna desejados

df = pd.DataFrame(columns = ['Column_name#1', 'Column_name#1'])

Colocar o valor da série dentro do quadro de dados usando o conceito de mapeamento

df['Column_name#1'] = series_1

df['Column_name#2'] = series_2

Verifique os resultados agora

df.head(5)
Sateesh
fonte
6

Não tenho certeza se entendi completamente sua pergunta, mas é isso que você deseja fazer?

pd.DataFrame(data=dict(s1=s1, s2=s2), index=s1.index)

( index=s1.indexnem é necessário aqui)

Bertrand L
fonte
3

Uma simplificação da solução com base em join():

df = a.to_frame().join(b)
Lorenzo A. Rossi
fonte
1

Eu usei pandas para converter minha matriz ou iseries numpy em um dataframe e adicionei e adicionei a coluna adicional por chave como 'previsão'. Se você precisar converter o quadro de dados novamente em uma lista, use values.tolist ()

output=pd.DataFrame(X_test)
output['prediction']=y_pred

list=output.values.tolist()     
Leão dourado
fonte