Quiero unir 2 marcos de datos y completar los valores nan. Sin embargo, a df le falta el primer valor en df2. ¿Cómo puedo completar eso desde df?

import pandas as pd
from datetime import datetime, timedelta

date_today = datetime.now()
days = pd.date_range(date_today, date_today + timedelta(7), freq='D')
data = range(len(days)-1)
days = days.delete(3)
date_today = date_today + timedelta(days=3)
df = pd.DataFrame({'test': days, 'col_df': data})
df = df.set_index('test')
print(df)

days2 = pd.date_range(date_today, date_today + timedelta(7), freq='D')
data2 = range(len(days2))
df2 = pd.DataFrame({'test': days2, 'col_df22': data2})
df2 = df2.set_index('test')
print(df2)

print(df2.join(df))

Df

                            col_df
test                              
2020-12-08 15:22:00.997578       0
2020-12-09 15:22:00.997578       1
2020-12-10 15:22:00.997578       2
2020-12-12 15:22:00.997578       3
2020-12-13 15:22:00.997578       4
2020-12-14 15:22:00.997578       5
2020-12-15 15:22:00.997578       6

Df2

                            col_df22
test                                
2020-12-11 15:22:00.997578         0
2020-12-12 15:22:00.997578         1
2020-12-13 15:22:00.997578         2
2020-12-14 15:22:00.997578         3
2020-12-15 15:22:00.997578         4
2020-12-16 15:22:00.997578         5
2020-12-17 15:22:00.997578         6
2020-12-18 15:22:00.997578         7

Df2.join (df)

                           col_df22  col_df
test                                        
2020-12-11 15:22:00.997578         0     NaN
2020-12-12 15:22:00.997578         1     3.0
2020-12-13 15:22:00.997578         2     4.0
2020-12-14 15:22:00.997578         3     5.0
2020-12-15 15:22:00.997578         4     6.0
2020-12-16 15:22:00.997578         5     NaN
2020-12-17 15:22:00.997578         6     NaN
2020-12-18 15:22:00.997578         7     NaN

Quiero:

                            col_df22  col_df
test                                        
2020-12-11 15:22:00.997578         0     2.0
2020-12-12 15:22:00.997578         1     3.0
2020-12-13 15:22:00.997578         2     4.0
2020-12-14 15:22:00.997578         3     5.0
2020-12-15 15:22:00.997578         4     6.0
2020-12-16 15:22:00.997578         5     6.0
2020-12-17 15:22:00.997578         6     6.0
2020-12-18 15:22:00.997578         7     6.0
1
ManInMoon 8 dic. 2020 a las 18:28

2 respuestas

La mejor respuesta

Puedes probar merge_asof:

pd.merge_asof(df2, df, left_index=True, right_index=True)

Salida:

                            col_df22  col_df
test                                        
2020-12-11 10:30:20.464611         0       2
2020-12-12 10:30:20.464611         1       3
2020-12-13 10:30:20.464611         2       4
2020-12-14 10:30:20.464611         3       5
2020-12-15 10:30:20.464611         4       6
2020-12-16 10:30:20.464611         5       6
2020-12-17 10:30:20.464611         6       6
2020-12-18 10:30:20.464611         7       6
0
Quang Hoang 8 dic. 2020 a las 15:34

Quiero unir 2 marcos de datos y completar los valores nan

Si desea reenviar el relleno, puede utilizar el método pandas.DataFrame.ffill() de esta manera:

df2.join(df).ffill()

    test    col_df22    col_df
2020-12-11 15:38:50.658011  0   NaN
2020-12-12 15:38:50.658011  1   3.0
2020-12-13 15:38:50.658011  2   4.0
2020-12-14 15:38:50.658011  3   5.0
2020-12-15 15:38:50.658011  4   6.0
2020-12-16 15:38:50.658011  5   6.0
2020-12-17 15:38:50.658011  6   6.0
2020-12-18 15:38:50.658011  7   6.0

Puede usar pandas.DataFrame.bfill() para completar los valores faltantes al revés y puede combinar los dos, por ejemplo:

df2.join(df).bfill().ffill()

test    col_df22    col_df
2020-12-11 15:38:50.658011  0   3.0
2020-12-12 15:38:50.658011  1   3.0
2020-12-13 15:38:50.658011  2   4.0
2020-12-14 15:38:50.658011  3   5.0
2020-12-15 15:38:50.658011  4   6.0
2020-12-16 15:38:50.658011  5   6.0
2020-12-17 15:38:50.658011  6   6.0
2020-12-18 15:38:50.658011  7   6.0

Éstos llenan NaN con el valor anterior o siguiente para el llenado hacia adelante y hacia atrás respectivamente. Enlace a documentación .

0
Jason 8 dic. 2020 a las 15:51