Как избежать NaN в средневзвешенном? - PullRequest
0 голосов
/ 18 января 2019

Вот мой фрейм данных df:

       str1    str2     str3     str4    
key1     3       4       2        5
key2    NaN      3       4        4
key3    NaN     NaN     NaN       2

и вектор w:

 [0.2, 0.3, 0.5]

Обычно я использую df.T.dot(w) для вычисления произведения между кадром данных и вектором. Но я хотел бы знать, как я могу избежать значения NaN путем повторного взвешивания вектора и вычисления, пока не существует полный столбец NaN.

Пример для моего случая:

Для первого столбца я бы хотел, чтобы вектор был равен v = [0.2+0.3+0.5, 0, 0] и вычислял [3, NaN, NaN] раз [1, 0, 0].

Для 2-го столбца я бы хотел v = [0.2+0.25, 0.3+0.25, 0].

Для 3-го столбца я бы хотел v = [0.2+0.25, 0.3+0.25, 0].

Для 4-го столбца я бы хотел v без изменений, потому что нет NaN.

Ожидаемый результат:

          str1   str2  str3    str4
    0      3     3.45   3.1     4.7

Ответы [ 2 ]

0 голосов
/ 18 января 2019

Если значение NaN должно означать «вес = 0» во внутреннем продукте, то перед выполнением вычисления измените ваш фрейм данных следующим образом:

df_without_nans = df.fillna(value=0.0)  # 'value' can be dropped
dot_product = df_without_nans.T.dot(w)
0 голосов
/ 18 января 2019

Я не уверен, что есть простой способ позаботиться о значениях nan. Возможно, вам придется создать собственную функцию скалярного произведения для обработки этих значений. Примерно так может работать:

df.apply(lambda x: (x * [1, 0, 0]).sum())

Метод pandas sum автоматически игнорирует значения nan, поэтому вам не нужно явно находить значения самостоятельно. Скорее всего, вы замените [1, 0, 0] ссылкой на другой массив ваших весов. Я не уверен, как у вас все устроено, чтобы интегрировать его в приведенное выше предложение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...