Как удалить следующую строку, если дублированные данные найдены в Excel с использованием Python? - PullRequest
0 голосов
/ 30 сентября 2019

Кто-нибудь знает, как удалить следующую строку, если дублированные данные были найдены в Excel с использованием Python?

Вот мои входные данные (только 2 столбца для входных данных):

col_1   col_2
1       number 2.37
2       number 2.8
3       number 3.4
4       number 
5       number 
6       number 
7       number 2.62
8       number 3.1
9       number 2.6

Если найдены дублированные данные, остальная часть строки должна быть удалена, начиная с дублированных данных. В этом случае приведенные выше входные данные показывают, что от строки 4 до строки 6 дублируются данные, это означает, что обнаружены дублированные данные, строка 4 до конца столбца, являющегося строкой 9, должна быть удалена.

Следовательно, выходные данные должны быть такими (есть только 2 столбца для выходных данных):

col_1   col_2
1       number 2.37
2       number 2.8
3       number 3.4

вот мой код: (но мой код, кажется, не достигает моей цели)

df = pd.read_excel(path_to_the_file)
df = df[~df.col_1.str.match('number')]
df.to_excel(path_to_the_file)

Любая помощь будет оценена, спасибо !!

Ответы [ 2 ]

1 голос
/ 30 сентября 2019
df = pd.read_excel(path_to_the_file)
index=df[df.duplicated(['col_2']) == True].values[0][0]
df2 = df.iloc[:index-2]
print(df2)

output:
   col_1       col_2
0      1  number2.37
1      2   number2.8
2      3   number3.4
0 голосов
/ 30 сентября 2019

Случай, который вы запрашиваете (независимо от того, какой столбец, какой или что означает «дублированные данные»), нуждается в цикле, потому что нарезка имеет свой собственный путь, она не должна быть итеративной функцией. То, что вы указываете в своем вопросе , зависит от данных, найденных в какой-то момент («следующая строка») . Таким образом, нарезку следует использовать, как только вы обнаружите, где эти данные дублируются (если это действительно так).

dataframe.str.match() функция возвращает полный ряд, который сообщает вам, происходит ли совпадение для каждогои каждая строка в кадре данных. Функция sum возвращает общее количество совпадений, добавляя приведенные логические значения к значению int в ряду. Если есть более одного совпадения (текущая строка + один), и только тогда, вы можете срезать df с этого момента. Первый ряд не может быть повторен (это первый и не нуждается в проверке).

Конкретное местонахождение того, что вы пытаетесь достичь, вы можете определить из этого примера.

import pandas as pd

for idx,row in df[1:].iterrows(): 
    if df.col_2.str.match(df.loc[idx].col_2).sum() > 1: 
        print("found at", idx) 
        df = df[:idx] 
        break

Имейте в виду, что это просто пример из коробки, break никогда не следует использовать, вы должны использовать elif и явно определять поведение вашего кода.

...