Мои панды / numpy ржавые, а написанный мной код неэффективен.
Я инициализирую массив нулей в Python3.x длиной 1000. Для моей цели это просто целые числа:
import numpy as np
array_of_zeros = np.zeros((1000, ), )
У меня также есть следующий DataFrame (который намного меньше моих фактических данных)
import pandas as pd
dict1 = {'start' : [100, 200, 300], 'end':[400, 500, 600]}
df = pd.DataFrame(dict1)
print(df)
##
## start end
## 0 100 400
## 1 200 500
## 2 300 600
DataFrame имеет два столбца, start
и end
. Эти значения представляют диапазон значений, то есть start
всегда будет меньшим целым числом, чем end
. Выше мы видим, что первая строка имеет диапазон 100-400
, следующая - 200-500
, а затем 300-600
.
Моя цель состоит в том, чтобы перебирать pandas DataFrame строка за строкой и увеличивать числовой массив array_of_zeros
на основе этих позиций индекса. Итак, если в кадре данных есть строка от 10
до 20
, я бы хотел увеличить ноль на +1 для индексов 10-20.
Вот код, который делает то, что я хотел бы:
import numpy as np
array_of_zeros = np.zeros((1000, ), )
import pandas as pd
dict1 = {'start' : [100, 200, 300], 'end':[400, 500, 600]}
df = pd.DataFrame(dict1)
print(df)
for idx, row in df.iterrows():
for i in range(int(row.start), int(row.end)+1):
array_of_zeros[i]+=1
И это работает!
print(array_of_zeros[15])
## output: 0.0
print(array_of_zeros[600])
## output: 1.0
print(array_of_zeros[400])
## output: 3.0
print(array_of_zeros[100])
## output: 1.0
print(array_of_zeros[200])
## output: 2.0
Мои вопросы: это очень неуклюжий код! Я не должен использовать так много циклов for с массивами numpy! Это решение будет очень неэффективным, если входной фрейм данных достаточно большой
Существует ли более эффективный (то есть более основанный на numpy) метод, позволяющий избежать этого цикла for?
for i in range(int(row.start), int(row.end)+1):
array_of_zeros[i]+=1
Возможно, есть решение, ориентированное на панд?