Обновление фрейма данных во время обхода

#python #pandas #dataframe #dataset #data-science

Вопрос:

Я работаю с фреймами данных, и мне нужно удалить несколько строк, когда я повторяю их.

Краткий обзор: Я читаю строку (N), сравниваю ее со следующими 20 строками (до N 20) и удаляю несколько строк между N и N 20 на основе сравнения. Затем я возвращаюсь к N 1 и сравниваю эту строку со следующими 20 строками, пока N 1 20. Я не хочу сравнивать N 1 со строками, которые я ранее удалил.

Однако, когда я удаляю строки, удаление не отражается во фрейме данных, когда я просматриваю его исходную копию, и изменение не было отражено. Есть какие-нибудь решения для этого?

 df = pd.read_csv(r"C:sniptest.csv")
index_to_delete = []

for index, row in df.iterrows():
    snip

    for i in range(20):
        if (index   i   1) < len(df.index):
            if condition:
                index_to_delete.append(index   i   1) #storing indices of rows to delete between N and N 20

    df.loc[index, ['snip1', 'snip2']] = [snip, snip] #updating values in row N
    df = df.drop(index_to_delete)
    index_to_delete.clear()
 

Ответ №1:

панды.Фрейм данных.iterrows():

Вы никогда не должны изменять то, над чем вы повторяете. Это не гарантирует, что сработает во всех случаях. В зависимости от типов данных итератор возвращает копию, а не представление, и запись в него не будет иметь никакого эффекта.

есть много трюков, чтобы решить проблему:

1: вы можете использовать len df вместо того, чтобы использовать df .

 for inx in range(len(df)):
    try:
        row = df.loc[inx]
    except:
        continue

 

2: сохраните проверенные индексы и пропустите их

 df = pd.read_csv(r"C:sniptest.csv")
all_index_to_delete = []
index_to_delete = []

for index, row in df.iterrows():
    if index in all_index_to_delete:
        continue
    snip

    for i in range(20):
        if (index   i   1) < len(df.index):
            if condition:
                index_to_delete.append(index   i   1) #storing indices of rows to delete between N and N 20
                all_index_to_delete.append(index   i   1) #storing indices of rows to delete between N and N 20

    df.loc[index, ['snip1', 'snip2']] = [snip, snip] #updating values in row N
    df = df.drop(index_to_delete)
    index_to_delete.clear()