Как применить эту функцию к кадру данных? - PullRequest
0 голосов
/ 19 февраля 2020

Предположим, у меня есть это df:

i      A     B     C

0     4     5    13
1    11    42    27
2     3     6    2.21
3     4     8    10
4    10     5    4
5     2    11    .5

и я хочу применить эту функцию к каждой строке: log [(df ['A']

$log((A_i - A_{i+1})^2+(B_i - B_{i+1})^2+(C_i - C_{i+1})^2)$
$log((A_i - A_{i+2})^2+(B_i - B_{i+2})^2+(C_i - C_{i+2})^2)$
.
.
.
$log((A_i - A_{i+5})^2+(B_i - B_{i+5})^2+(C_i - C_{i+5})^2)$

Например, для я = 0 и я = 1:

$log((4 - 11)^2+(5 - 42)^2+(13 - 27)^2)=3.2$

У меня есть этот код. Но не работает.

for point in df:
    x = [np.log((A[0]-A[1] )**2+ (B[0]-B[1] )**2+(C[0]-C[1] )**2) for x in df]

1 Ответ

1 голос
/ 19 февраля 2020

Разница строк вперед с помощью df[['A', 'B', 'C']].diff(-1), квадрат результата с помощью .apply(lambda x: x * x) (или .pow(2)), сумма результата с помощью .sum(axis=1) и затем запись в лог этих сумм. Присвойте результат обратно фрейму данных.

>>> df.assign(result=np.log(df[['A', 'B', 'C']].diff(-1).apply(lambda x: x * x).sum(axis=1)))
   i   A   B      C    result
0  0   4   5  13.00  7.386471  # np.log((4 - 11) ** 2 + (5 - 42) ** 2 + (13 - 27) ** 2) = 7.386...
1  1  11  42  27.00  7.588093
2  2   3   6   2.21  4.184857
3  3   4   8  10.00  4.394449
4  4  10   5   4.00  4.720729
5  5   2  11   0.50      -inf

В качестве альтернативы, чтобы отличать каждую строку от первой, используйте (df[['A', 'B', 'C']].iloc[0, :] - df[['A', 'B', 'C']]). Все остальное тоже самое.

>>> df.assign(
        result=np.log(
            (df[['A', 'B', 'C']].iloc[0, :] - df[['A', 'B', 'C']]).pow(2).sum(axis=1))
    )

   i   A   B      C    result
0  0   4   5  13.00      -inf
1  1  11  42  27.00  7.386471
2  2   3   6   2.21  4.774272
3  3   4   8  10.00  2.890372
4  4  10   5   4.00  4.762174
5  5   2  11   0.50  5.279389
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...