#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()