Combinando dos series en un DataFrame en pandas

278

Tengo dos series s1y s2con los mismos índices (no consecutivos). ¿Cómo combino s1y s2ser dos columnas en un DataFrame y mantener uno de los índices como una tercera columna?

usuario7289
fuente

Respuestas:

417

Creo que concates una buena manera de hacer esto. Si están presentes, utiliza los atributos de nombre de la Serie como columnas (de lo contrario, simplemente los 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: Esto se extiende a más de 2 series.

Andy Hayden
fuente
55
esto en realidad también evita copiar (en comparación con la solución dict)
Jeff
En un caso, parece decirme 'ValueError: el valor de verdad de una matriz con más de un elemento es ambiguo. Utilice a.any () o a.all () ', ¿alguna idea?
user7289
@ user7289 no está seguro de dónde vendría eso, ¿podría hacer esto como otra pregunta?
Andy Hayden
@AndyHayden: ¿qué pasa si hay duplicados a lo largo de uno o ambos índices?
Mannaggia
2
@dafinguzman lo que significa "reutilizar constantemente esta función" es que debería preferir hacer el concat una vez antes de pd.concat([list_of_dataframes]) concatenar muchas veces new_df = pd.DataFrame(); for df in list_of_dsf: new_df = pd.concat([new_df, df])o similar.
Andy Hayden
38

¿Por qué no usas .to_frame si ambos tienen los mismos índices?

> = v0.23

a.to_frame().join(b)

< v0.23

a.to_frame().join(b.to_frame())
swmfg
fuente
44
Quizás esto sería más apropiado: a.to_frame (name = 'a'). Join (b.to_frame (name = 'b'))
user3282777
33

Los pandas alinearán automáticamente estos pasados ​​en serie y crearán el índice conjunto. Aquí resultan ser los mismos. reset_indexmueve el índice a una columna.

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
fuente
16

Código de ejemplo:

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})

Pandas le permite crear un DataFramedesde a dictcon Serieslos valores y los nombres de las columnas como claves. Cuando encuentra un Seriesvalor, usa el Seriesíndice como parte del DataFrameíndice. Esta alineación de datos es una de las principales ventajas de los pandas. En consecuencia, a menos que tenga otras necesidades, lo recién creado DataFrametiene un valor duplicado. En el ejemplo anterior, data['idx_col']tiene los mismos datos que data.index.

jbn
fuente
13

Si puedo responder esto.

Los fundamentos detrás de convertir series a marcos de datos es entender que

1. A nivel conceptual, cada columna en el marco de datos es una serie.

2. Y, cada nombre de columna es un nombre clave que se asigna a una serie.

Si tiene en mente los dos conceptos anteriores, puede pensar en muchas formas de convertir series en marcos de datos. Una solución fácil será así:

Crea dos series aquí

import pandas as pd

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

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

Cree un marco de datos vacío con los nombres de columna que desee

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

Poner el valor de la serie dentro del marco de datos usando el concepto de mapeo

df['Column_name#1'] = series_1

df['Column_name#2'] = series_2

Comprueba los resultados ahora

df.head(5)
Sateesh
fuente
6

No estoy seguro de entender completamente tu pregunta, pero ¿es esto lo que quieres hacer?

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

( index=s1.indexNi siquiera es necesario aquí)

Bertrand L
fuente
3

Una simplificación de la solución basada en join():

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

Usé pandas para convertir mi matriz o iseries numpy a un marco de datos y luego agregué y agregué la columna adicional por clave como 'predicción'. Si necesita convertir el marco de datos a una lista, use values.tolist ()

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

list=output.values.tolist()     
Leon de Oro
fuente