У меня есть фрейм данных (ниже, т. Е. Членство), в одном поле (A) есть несколько строк со значением в отсортированном виде. Существует также новое поле (новое), которое в начале процесса является копией поля C
. Я хотел бы сделать следующее: если предыдущая строка в A
совпадает с текущей строкой в A
, и если либо текущая строка new
, либо предыдущая строка new
равна 1
присвоить 1 текущему new
. В конце, в последнем случае повторных значений A
, new
будет 1
или 0
в зависимости от условий в функции, а предыдущие значения, где повторяется A
, будут иметь new
быть 0
. Я могу сделать это с помощью функции ниже.
membership = pd.DataFrame.from_dict(dict([('A', ['20000000460', '20000000460', '20000000460','20000000460','20000000459','20000000461','20000000461','20000000462','20000000464','20000000464','20000000464','20000000464','20000000465','20000000465','20000000466']), ('B', [4,0, 5,0, 6,0,2,5,6,7,4,3,2,7,9]), ('C', [1,1,0,0,0,1,0,1,1,1,0,0,0,0,1])]))
def members(df, field):
df[field] = df.C
print(field)
for i in range(1, df.shape[0]):
if (df.loc[i, 'A'] == df.loc[i-1, 'A']) and\
(df.loc[i-1, field] == 1 or df.loc[i, field] == 1):
df.loc[i, field] = 1
df.loc[i-1, field] = 0
Результаты этой функции на фрейме данных в этом введите описание изображения здесь
Проблема в том, что у меня очень большой набор данных, и эта функция запускается очень медленно. Как я могу улучшить код, чтобы сделать его быстрее? Я знаю, если я смогу векторизовать эту функцию в пандах, время значительно улучшится. Как я могу векторизовать эту функцию?