создание кадра данных pandas на основе содержимого ячейки двух других кадров данных - PullRequest
0 голосов
/ 16 ноября 2018

У меня есть два кадра данных с одинаковым количеством строк и столбцов. Я хотел бы создать третий фрейм данных, основанный на этих двух фреймах данных, который имеет те же измерения, что и два других фрейма данных. Каждая ячейка в третьем кадре данных должна быть результатом функции, примененной к соответствующим значениям ячейки в df1 и df2 соответственно.

т.е. если у меня есть

df1 = | 1 | 2 |
      | 3 | 4 |

df2 = | 5 | 6 |
      | 7 | 8 |

тогда df3 должен быть таким

df3 = | func(1, 5) | func(2, 6) |
      | func(3, 7) | func(4, 8) |

У меня есть способ сделать это, который я не считаю слишком питоническим и не подходящим для больших информационных фреймов, и хотел бы знать, существует ли эффективный способ сделать это?

Функция, которую я хочу применить:

def smape3(y, yhat, axis=0):
    all_zeros = not (np.any(y) and np.any(yhat))
    if all_zeros:
        return 0.0
    return np.sum(np.abs(yhat - y), axis) / np.sum(np.abs(yhat + y), axis)

Может использоваться для создания единственного скалярного значения ИЛИ массива значений. В моем случае использования выше входные данные для функции были бы двумя скалярными значениями. So smape (1,5) = 0,66.

1 Ответ

0 голосов
/ 16 ноября 2018

Вы можете использовать векторизованный подход:

df1 = pd.DataFrame([[1, 2], [3, 4]])
df2 = pd.DataFrame([[5, 6], [7, 8]])

arr = np.where(df1.eq(0) & df2.eq(0), 0, (df2 - df1).abs() / (df2 + df1).abs())

df = pd.DataFrame(arr)

print(df)

          0         1
0  0.666667  0.500000
1  0.400000  0.333333

Или, если вы хотите отделить часть логики в функции:

def smape3(df1, df2):
    return (df2 - df1).abs() / (df2 + df1).abs()

df = pd.DataFrame(np.where(df1.eq(0) & df2.eq(0), 0, smape3(df1, df2)))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...