Вы можете использовать тот факт, что кадры данных совместно используют индекс, назначения и замены выравниваются по индексу перед работой.
df1 = pd.DataFrame.from_records(
[
{"Time": 1, "col1": "a", "col2": 11},
{"Time": 2, "col1": "b", "col2": 12},
{"Time": 3, "col1": "c", "col2": 13},
{"Time": 4, "col1": "d", "col2": 14},
]
).set_index("Time")
df2 = pd.DataFrame.from_records(
[
{"Time": 1, "col3": 11, "col1": np.nan},
{"Time": 2, "col3": 15, "col1": np.nan},
{"Time": 3, "col3": 66, "col1": np.nan},
{"Time": 4, "col3": 78, "col1": np.nan},
{"Time": 5, "col3": 33, "col1": "f"},
{"Time": 6, "col3": 22, "col1": "g"},
]
).set_index("Time")
dfs = [df1, df2]
index = pd.Index(dfs[0].index)
for this_df in dfs[1:]:
index = index.union(this_df.index)
df = pd.DataFrame(index=index)
for this_df in dfs:
for col in this_df.columns:
if col not in df.columns:
df[col] = this_df[col]
else:
df[col] = df[col].fillna(this_df[col])
print(df)
col1 col2 col3
Time
1 a 11.0 11
2 b 12.0 15
3 c 13.0 66
4 d 14.0 78
5 f NaN 33
6 g NaN 22