Удаление повторяющихся значений в столбце, но сохранение первого дублирующего значения для кадра данных в python - PullRequest
0 голосов
/ 25 июня 2019

У меня есть CSV-файл, который выглядит следующим образом:

Timestamp  Status
1501       Normal
1501       Normal
1502       Delay
1503       Received
1504       Normal
1504       Delay
1505       Received
1506       Received
1507       Delay
1507       Received

Мне удалось добавить новый столбец «Уведомление» в фрейм данных, который отображается как переменная счетчика и имеет приращение, когда он сталкивается сПолученное значение в столбце «Статус».Теперь у меня есть вывод:

Timestamp  Status     Notif
1501       Normal     N0
1501       Normal     N0
1502       Delay      N0
1503       Received   N1
1504       Normal     N1
1504       Delay      N1
1505       Received   N2
1506       Received   N3
1507       Delay      N3
1507       Received   N4

Теперь я хочу удалить все повторяющиеся значения в столбце, сохранив первое.Я хочу вывод как:

Timestamp  Status     Notif
1501       Normal     N0
1501       Normal     
1502       Delay      
1503       Received   N1
1504       Normal     
1504       Delay      
1505       Received   N2
1506       Received   N3
1507       Delay      
1507       Received   N4

Для первого выхода с N0, N0, N0, N1, N1, N1, N2, N3, N3, N4 я использовал код:

df['Notif'] = None
counter = 0
for idx, row in df.iterrows():
    if df.iloc[idx, 1] == "Received":
        counter +=1
    df.iloc[idx,-1] = "N" + str(counter)

Для удаления части с дублирующимися значениями я использовал:

df.drop_duplicates(subset='Notif', keep="first")

После запуска моего кода для удаления дубликатов кажется, что столбец «Уведомление» получает странное числовое значение 400 на всем протяжении.

Ответы [ 2 ]

0 голосов
/ 25 июня 2019

Нет необходимости в каком-либо цикле (как в другом ответе).Вы можете сделать это с помощью single instrction:

df.Notif = df.Notif.mask(df.Notif.duplicated(), '')

df.Notif.duplicated() генерирует серию bool , отмечая дублированные значения, кроме первого (значение по умолчанию: keep это просто first ).

Затем оно используется как условие в mask , который устанавливает пустую строку (второй аргумент) вэлементы, обозначенные True значениями.

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

0 голосов
/ 25 июня 2019

Вы можете просто сделать присваивание частью цикла, в котором находится строка «Received».Тогда вам не придется удалять какие-либо строки, а только добавлять их в правильные строки.

df['Notif'] = None
counter = 0
for idx, row in df.iterrows():
    if df.iloc[idx, 1] == "Received":
        counter +=1
        df.iloc[idx,-1] = "N" + str(counter)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...