Прекратить применять при выполнении условия - PullRequest
0 голосов
/ 15 мая 2018

У меня есть пандас DataFrame с 1000 столбцами и 30 миллионами строк выборок.Мне нужно выполнить некоторые операции (скажем, сложение, умножение и т. Д.) В каждом столбце.Если какое-либо значение в каком-либо столбце после операции изменится на 0, тогда мне нужно прекратить применять операции в отношении остальных столбцов и строк.Кроме того, я хотел бы знать, в каком столбце и строке он изменился на 0.

Я использовал iterrows с несколькими проверками, но есть проблема с производительностью, поскольку имеется много данных.Кроме того, есть ли альтернативы для применения, итерроу?

ID   PID     PC   TID
10   1005   8017  3
11   10335  5019  2
12   1000   8017  1
13   243    8870  1
14   4918   8305  3
15   9017   8305  3

Применить операции по столбцам:

  • Col1 вычесть на 9.
  • Col2 вычесть на 1000.
  • Col3 разделить на 100.
  • Col4 вычесть на 1.

После применения ко второму столбцу 3-е значение равно 0, а затем весь процесс должен быть остановлен.и вернуть 2-й столбец 3-го ряда.

Вывод: если выполняются мудрые операции в столбцах:

ID   PID    PC     TID
1    5      8017   3
2    9335   5019   2
3    0      8017   1
4    243    8870   1
5    4918   8305   3
6    9017   8305   3

Если выполняются мудрые операции в строках:

ID   PID    PC      TID
1    5      80.17   2
2    9335   50.19   1
3    0      8017    1
13   243    8870    1
14   4918   8305    3
15   9017   8305    3

Ответы [ 2 ]

0 голосов
/ 16 мая 2018

Это мое решение, как я упоминаю в комментарии

df1=df.copy()
df['PID']-=1000;df['PC']/=9;df['TID']-=1;df['ID']-=9

s=df.eq(0).idxmax(axis=0)
s
Out[492]:
ID     0
PID    2
PC     0
TID    2
dtype: int64

for x ,i in s.iteritems():
    df.loc[i:,x]=df1.loc[i:,x]
0 голосов
/ 16 мая 2018

Учитывая, что у вас гораздо больше строк, чем столбцов, и что векторизованные операции намного быстрее, я бы предложил следующее:

for c in df.columns:
    res = <apply function on df[c]>
    if (res != 0).all(): # No zero found
        df[c] = res
        continue
    # Zero found - apply only up to it.
    df[c] = res[(res != 0).astype(int).cumsum() == 0] # Apply up to first 0
    break
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...