python - manejo - pandas concat
Crear un DataFrame de pandas a partir de columnas de otros DataFrames con índices similares (2)
Bueno, no estoy seguro de que la fusión sea el camino a seguir. Personalmente, crearía un nuevo marco de datos creando un índice de las fechas y luego construyendo las columnas usando listas de comprensión. Posiblemente no es la forma más pitonica, pero parece funcionar para mi!
import pandas as pd
import numpy as np
df1 = pd.DataFrame(np.random.randn(5,3), index=pd.date_range(''01/02/2014'',periods=5,freq=''D''), columns=[''a'',''b'',''c''] )
df2 = pd.DataFrame(np.random.randn(8,3), index=pd.date_range(''01/01/2014'',periods=8,freq=''D''), columns=[''a'',''b'',''c''] )
# Create an index list from the set of dates in both data frames
Index = list(set(list(df1.index) + list(df2.index)))
Index.sort()
df3 = pd.DataFrame({''df1'': [df1.loc[Date, ''c''] if Date in df1.index else np.nan for Date in Index],/
''df2'': [df2.loc[Date, ''c''] if Date in df2.index else np.nan for Date in Index],},/
index = Index)
df3
Tengo 2 DataFrames df1 y df2 con los mismos nombres de columna [''a'', ''b'', ''c''] e indexados por fechas. El índice de fecha puede tener valores similares. Me gustaría crear un DataFrame df3 con solo los datos de las columnas [''c''] renombradas respectivamente ''df1'' y ''df2'' y con el índice de fecha correcto. Mi problema es que no puedo obtener la forma de fusionar el índice correctamente.
df1 = pd.DataFrame(np.random.randn(5,3), index=pd.date_range(''01/02/2014'',periods=5,freq=''D''), columns=[''a'',''b'',''c''] )
df2 = pd.DataFrame(np.random.randn(8,3), index=pd.date_range(''01/01/2014'',periods=8,freq=''D''), columns=[''a'',''b'',''c''] )
df1
a b c
2014-01-02 0.580550 0.480814 1.135899
2014-01-03 -1.961033 0.546013 1.093204
2014-01-04 2.063441 -0.627297 2.035373
2014-01-05 0.319570 0.058588 0.350060
2014-01-06 1.318068 -0.802209 -0.939962
df2
a b c
2014-01-01 0.772482 0.899337 0.808630
2014-01-02 0.518431 -1.582113 0.323425
2014-01-03 0.112109 1.056705 -1.355067
2014-01-04 0.767257 -2.311014 0.340701
2014-01-05 0.794281 -1.954858 0.200922
2014-01-06 0.156088 0.718658 -1.030077
2014-01-07 1.621059 0.106656 -0.472080
2014-01-08 -2.061138 -2.023157 0.257151
El DataFrame df3 debe tener la siguiente forma:
df3
df1 df2
2014-01-01 NaN 0.808630
2014-01-02 1.135899 0.323425
2014-01-03 1.093204 -1.355067
2014-01-04 2.035373 0.340701
2014-01-05 0.350060 0.200922
2014-01-06 -0.939962 -1.030077
2014-01-07 NaN -0.472080
2014-01-08 NaN 0.257151
Pero con NaN en la columna df1 como el índice de fecha de df2 es más amplio. (En este ejemplo, obtendría NaN para las siguientes fechas: 2014-01-01, 2014-01-07 y 2014-01-08)
Gracias por tu ayuda.
Puedes usar concat :
In [11]: pd.concat([df1[''c''], df2[''c'']], axis=1, keys=[''df1'', ''df2''])
Out[11]:
df1 df2
2014-01-01 NaN -0.978535
2014-01-02 -0.106510 -0.519239
2014-01-03 -0.846100 -0.313153
2014-01-04 -0.014253 -1.040702
2014-01-05 0.315156 -0.329967
2014-01-06 -0.510577 -0.940901
2014-01-07 NaN -0.024608
2014-01-08 NaN -1.791899
[8 rows x 2 columns]
El argumento del eje determina la forma en que se apilan los DataFrames:
df1 = pd.DataFrame([1, 2, 3])
df2 = pd.DataFrame([''a'', ''b'', ''c''])
pd.concat([df1, df2], axis=0)
0
0 1
1 2
2 3
0 a
1 b
2 c
pd.concat([df1, df2], axis=1)
0 0
0 1 a
1 2 b
2 3 c