How to combine numeric columns in pandas dataframe with NaN?

Maybe combine_first could help?

import numpy as np


df["measurement"] = df["measurement_1"].combine_first(df["measurement_2"])
df["measurement_type"] = np.where(df["measurement_1"].notnull(), 1, 2)
df.drop(["measurement_1", "measurement_2"], 1)

    ID  measurement measurement_type
0   0   3           1
1   1   5           2
2   2   7           2


Use DataFrame.stack to reshape the dataframe then use reset_index and use DataFrame.assign to assign the column measurement_type by using Series.str.split + Series.str[:1] on level_1:

df1 = (
    df.set_index('ID').stack().reset_index(name='measurement')
    .assign(mesurement_type=lambda x: x.pop('level_1').str.split('_').str[-1])
)

Result:

print(df1)
   ID  measurement mesurement_type
0   0          3.0               1
1   1          5.0               2
2   2          7.0               2

Set a threshold and drop any that has more than one NaN. Use df.assign to fillna() measurement_1 and apply np.where on measurement_2

  df= df.dropna(thresh=2).assign(measurement=df.measurement_1.fillna\
                             (df.measurement_2), measurement_type=np.where(df.measurement_2.isna(),1,2)).drop(columns=['measurement_1','measurement_2'])

    ID  measurement  measurement_type
0   0              3              1
1   1              5              2
2   2              7              2