python - juntar - Combinación de dos Series en un DataFrame en pandas
juntar dos columnas en python (6)
Tengo dos Series s1
y s2
con los mismos índices (no consecutivos). ¿Cómo combino s1
y s2
para que sean dos columnas en un DataFrame y guardo uno de los índices como una tercera columna?
¿Por qué no usa simplemente .to_frame si ambos tienen los mismos índices?
a.to_frame().join(b.to_frame())
^^ Esto no funcionará si se intenta ''unir'' dos series de pandas
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 DataFrame
desde un dict
con Series
como los valores y los nombres de las columnas como las claves. Cuando encuentra una Series
como un valor, utiliza el índice de la Series
como parte del índice de DataFrame
. Esta alineación de datos es una de las principales ventajas de Pandas. En consecuencia, a menos que tenga otras necesidades, el DataFrame
recién creado tiene un valor duplicado. En el ejemplo anterior, los data[''idx_col'']
tienen los mismos datos que data.index
.
Creo que concat
es una buena forma 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.
Los Pandas alinearán automáticamente estos pasados en serie y crearán el índice conjunto. Pasan a ser lo mismo aquí. reset_index
mueve 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
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.index
ni siquiera es necesario aquí)
Una simplificación de la solución basada en join()
:
df = a.to_frame().join(b)