У меня есть 3 столбца, которые должны быть взвешены и суммированы.Однако иногда в этих столбцах присутствуют значения Nan, и это влияет на окончательный набор столбцов, которые взвешиваются и суммируются.Далее пример df:
import numpy as np
import pandas as pd
f = { 'A': [1, np.nan, 2, np.nan, 5, 6, np.nan],
'B': [np.nan, np.nan, 1, 1, 1, np.nan, 7],
'C': [np.nan, 2, 3, 6, np.nan, 5, np.nan]}
fd = pd.DataFrame(data = f)
fd.head(10)
A B C
0 1.0 NaN NaN
1 NaN NaN 2.0
2 2.0 1.0 3.0
3 NaN 1.0 6.0
4 5.0 1.0 NaN
5 6.0 NaN 5.0
6 NaN 7.0 NaN
Этот пример демонстрирует все возможные комбинации Nan в столбцах.Затем я хотел бы создать столбец F, который представляет собой взвешенную сумму столбцов A, B и C, когда они не являются Nan.Вот мой код:
def scaler(df):
"Scaling and summing"
if (pd.notnull(df['A']) == True & pd.notnull(df['B']) == True & pd.notnull(df['C']) == True):
return df['A']*0.5+df['B']*0.25+df['C']*0.25
elif (pd.notnull(df['A']) == True & pd.notnull(df['B']) == False & pd.notnull(df['C']) == False):
return df['A']*1
elif (pd.notnull(df['A']) == True & pd.notnull(df['B']) == True & pd.notnull(df['C']) == False):
return df['A']*0.75+df['B']*0.25
elif (pd.notnull(df['A']) == True & pd.notnull(df['B']) == False & pd.notnull(df['C']) == True):
return df['A']*0.75+df['C']*0.25
elif (pd.notnull(df['A']) == False & pd.notnull(df['B']) == True & pd.notnull(df['C']) == True):
return df['B']*0.5+df['C']*0.5
elif (pd.notnull(df['A']) == False & pd.notnull(df['B']) == True & pd.notnull(df['C']) == False):
return df['B']*1
else:
return df['C']*1
fd['F'] =fd.apply(scaler, axis = 'columns')
fd.head(10)
A B C F
0 1.0 NaN NaN NaN
1 NaN NaN 2.0 NaN
2 2.0 1.0 3.0 2.0
3 NaN 1.0 6.0 6.0
4 5.0 1.0 NaN NaN
5 6.0 NaN 5.0 5.0
6 NaN 7.0 NaN 7.0
Итак, я получаю df, где правильно взвешены и суммированы только столбцы со всеми тремя значениями, отличными от Nan.Если в одном из столбцов есть хотя бы один Nan, я получаю либо Nan, либо неверное результирующее значение в столбце F.
Чтобы преодолеть эту проблему, я заменил все значения Nan в исходном df с помощью некоторого числа с плавающей запятойкоторый находится вне диапазона для всех столбцов, а затем представлен выше, логика кода работает отлично.Мои вопросы:
1) почему это происходит (все значения Нана переключаются вокруг результатов, хотя столбцы, содержащие эти значения, не участвуют непосредственно в формулах, которые перенастраиваются)?
2)То, как я преодолел проблему, я нахожу немного неаккуратным.Может быть, есть более элегантное решение?