Панды: Как применить функцию построчно в порядке убывания к нескольким столбцам - PullRequest
0 голосов
/ 18 ноября 2018

У меня есть датафрейм df1 с 1000 столбцами.В каждом столбце есть случайное значение.Это выглядит так:

     0  1   2   3   4   5   6   7   8   9   ...     990 991 992 993 994 995 996 997 998 999
0   23  15  4   4   23  0   38  14  11  14  ...     22  3   25  3   24  8   1   14  18  27

У меня есть второй фрейм данных df2 с секундными значениями f, который выглядит следующим образом:

                        dtm     f
0   2018-03-01 00:00:00 +0000   50.135
1   2018-03-01 00:00:01 +0000   50.130
2   2018-03-01 00:00:02 +0000   50.120
3   2018-03-01 00:00:03 +0000   50.112
4   2018-03-01 00:00:04 +0000   50.102
5   2018-03-01 00:00:05 +0000   50.097
6   2018-03-01 00:00:06 +0000   50.095
7   2018-03-01 00:00:07 +0000   50.095
8   2018-03-01 00:00:08 +0000   50.092
9   2018-03-01 00:00:09 +0000   50.095
10  2018-03-01 00:00:10 +0000   50.097
11  2018-03-01 00:00:11 +0000   50.097
12  2018-03-01 00:00:12 +0000   50.097
13  2018-03-01 00:00:13 +0000   50.100
14  2018-03-01 00:00:14 +0000   50.102
15  2018-03-01 00:00:15 +0000   50.105
16  2018-03-01 00:00:16 +0000   50.102
17  2018-03-01 00:00:17 +0000   50.102
18  2018-03-01 00:00:18 +0000   50.100
19  2018-03-01 00:00:19 +0000   50.100
20  2018-03-01 00:00:20 +0000   50.100
21  2018-03-01 00:00:21 +0000   50.097
22  2018-03-01 00:00:22 +0000   50.097
23  2018-03-01 00:00:23 +0000   50.095
24  2018-03-01 00:00:24 +0000   50.092
25  2018-03-01 00:00:25 +0000   50.090
26  2018-03-01 00:00:26 +0000   50.090
27  2018-03-01 00:00:27 +0000   50.087
28  2018-03-01 00:00:28 +0000   50.085
29  2018-03-01 00:00:29 +0000   50.082
...     ...     ...
86371   2018-03-01 23:59:31 +0000   49.925
86372   2018-03-01 23:59:32 +0000   49.925
86373   2018-03-01 23:59:33 +0000   49.925
86374   2018-03-01 23:59:34 +0000   49.927
86375   2018-03-01 23:59:35 +0000   49.927
86376   2018-03-01 23:59:36 +0000   49.930
86377   2018-03-01 23:59:37 +0000   49.930
86378   2018-03-01 23:59:38 +0000   49.930
86379   2018-03-01 23:59:39 +0000   49.930
86380   2018-03-01 23:59:40 +0000   49.930
86381   2018-03-01 23:59:41 +0000   49.930
86382   2018-03-01 23:59:42 +0000   49.930
86383   2018-03-01 23:59:43 +0000   49.927
86384   2018-03-01 23:59:44 +0000   49.925
86385   2018-03-01 23:59:45 +0000   49.925
86386   2018-03-01 23:59:46 +0000   49.920
86387   2018-03-01 23:59:47 +0000   49.920
86388   2018-03-01 23:59:48 +0000   49.920
86389   2018-03-01 23:59:49 +0000   49.920
86390   2018-03-01 23:59:50 +0000   49.920
86391   2018-03-01 23:59:51 +0000   49.917
86392   2018-03-01 23:59:52 +0000   49.917
86393   2018-03-01 23:59:53 +0000   49.915
86394   2018-03-01 23:59:54 +0000   49.915
86395   2018-03-01 23:59:55 +0000   49.915
86396   2018-03-01 23:59:56 +0000   49.912
86397   2018-03-01 23:59:57 +0000   49.915
86398   2018-03-01 23:59:58 +0000   49.917
86399   2018-03-01 23:59:59 +0000   49.917
86400   2018-03-02 00:00:00 +0000   49.915

Начиная с начальных значений df1, мне нужноувеличивать их на 1 каждый раз, когда f> 50, и уменьшать на 1 всякий раз, когда f <50.Результатом должен быть другой фрейм данных с 1 строкой на каждую секунду, относительным значением и 1000 столбцами.Я пытался: </p>

if (f.f>50).any():
    df1=df1.apply(lambda x: ((f.f/f.f)*x+1).cumsum())

Но это приводит только к таблице с правильной первой строкой, а затем NaN везде в 86400 строк.

Любая помощь?Заранее спасибо

1 Ответ

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

Вероятно, не самое эффективное решение для памяти ...

# Preallocate the result DataFrame
res = pd.DataFrame(np.tile(df1, (len(df2), 1)))

# Compute a numpy array of corrections to add to each cell in `res`
mask = np.where(df2.f > 50, 1, -1)
adjust = np.tile(mask, (len(res), 1)).T.cumsum(axis=0)

# Add the adjustment array to the result DataFrame
res += adjust
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...