Я считаю, что нужно where
для фильтрации по условию с concat
для объединения всех DataFrame
с и combine_first
для замены NaN
с другого DataFrame
:
df1 = df[['d','e','f']].where(df['c'].eq(0))
df1.columns = ['x1','x2','x3']
df2 = df[['m','n','o']].where(df['l'].eq(0))
df2.columns = ['y1','y2','y3']
df31 = df[['m','n','o']].where(df['l'].eq(1) & df['o'].notnull())
df31.columns = ['z1','z2','z3']
df32 = df[['r','s','t']].where(df['l'].eq(1) & df['t'].notnull())
df32.columns = ['z1','z2','z3']
df = pd.concat([df1, df2, df31.combine_first(df32)], axis=1)
print (df)
x1 x2 x3 y1 y2 y3 z1 z2 z3
2 418 -5 -81 NaN NaN NaN NaN NaN NaN
5 415 -5 -116 487.0 -5.0 116.0 NaN NaN NaN
7 413 -5 -116 NaN NaN NaN 462.0 -24.0 -111.0