Следуя логике в моем комментарии, самое простое, что можно сделать с Пандами - это создать промежуточные столбцы.В конце концов вы можете удалить их или оптимизировать их, если вы не хотите их.Но это простой способ инкапсулировать вашу логику.Что вы хотите сделать, это взять фрейм данных, подобный следующему:
>>> df
a b c d
0 0.414762 0.113796 0.134529 NaN
1 NaN 0.662192 0.703417 NaN
2 0.958970 NaN 0.237540 NaN
3 0.975512 0.241572 NaN 0.720148
4 0.719265 0.735744 0.801279 NaN
и создать несколько промежуточных столбцов со значением df['a']
, когда оно не равно NaN
, и в противном случае заполнить значением df['b']
.Вы можете сделать это с помощью df.fillna()
довольно легко;Вы можете использовать его для заполнения значений NaN
значениями из другого столбца.Тогда вы можете просто взять разницу этих двух столбцов.Например,
>>> df['a_or_b'] = df['a'].fillna(df['b'])
>>> df['c_or_d'] = df['c'].fillna(df['d'])
>>> df['e'] = df['a_or_b'] - df['c_or_d']
>>> df
a b c d a_or_b c_or_d e
0 0.414762 0.113796 0.134529 NaN 0.414762 0.134529 0.280233
1 NaN 0.662192 0.703417 NaN 0.662192 0.703417 -0.041225
2 0.958970 NaN 0.237540 NaN 0.958970 0.237540 0.721430
3 0.975512 0.241572 NaN 0.720148 0.975512 0.720148 0.255364
4 0.719265 0.735744 0.801279 NaN 0.719265 0.801279 -0.082013
Предполагается, что пропущенные значения NaN
, а ваши N/A
.Вы также можете использовать df.replace()
таким же образом, чтобы заменить значение строк:
>>> df
a b c d
0 0.414762 0.113796 0.134529 N/A
1 N/A 0.662192 0.703417 N/A
2 0.95897 N/A 0.23754 N/A
3 0.975512 0.241572 N/A 0.720148
4 0.719265 0.735744 0.801279 N/A
>>> df['a_or_b'] = df['a'].replace('N/A', df['b'])
>>> df['c_or_d'] = df['c'].replace('N/A', df['d'])
>>> df['e'] = df['a_or_b'] - df['c_or_d']
>>> df
a b c d a_or_b c_or_d e
0 0.414762 0.113796 0.134529 N/A 0.414762 0.134529 0.280233
1 N/A 0.662192 0.703417 N/A 0.662192 0.703417 -0.041225
2 0.95897 N/A 0.23754 N/A 0.958970 0.237540 0.721430
3 0.975512 0.241572 N/A 0.720148 0.975512 0.720148 0.255364
4 0.719265 0.735744 0.801279 N/A 0.719265 0.801279 -0.082013
Хотя я рекомендую не использовать строки, но фактические значения нулевого типа, когда выработая с ними, например NaN
(np.nan
) или None
вместо строки типа N/A
.
В любом случае, теперь вы знаете, что такое промежуточные столбцы --- такВы можете просто напрямую использовать эти результаты, вместо того, чтобы назначать их на фрейм данных, если не хотите.
>>> df
a b c d
0 0.414762 0.113796 0.134529 N/A
1 N/A 0.662192 0.703417 N/A
2 0.95897 N/A 0.23754 N/A
3 0.975512 0.241572 N/A 0.720148
4 0.719265 0.735744 0.801279 N/A
>>> df['e'] = df['a'].replace('N/A', df['b']) - df['c'].replace('N/A', df['d'])
>>> df
a b c d e
0 0.414762 0.113796 0.134529 N/A 0.280233
1 N/A 0.662192 0.703417 N/A -0.041225
2 0.95897 N/A 0.23754 N/A 0.721430
3 0.975512 0.241572 N/A 0.720148 0.255364
4 0.719265 0.735744 0.801279 N/A -0.082013