#python #pandas
#python #pandas
Вопрос:
У меня есть фрейм данных pandas, и я пытаюсь удалить дублирующиеся строки, если столбец файла равен «AAA». Если есть «AAA», но нет других строк с таким же идентификатором / именем, то я хочу оставить строку (ы) в покое.
Что у меня есть
import pandas as pd
df = pd.DataFrame({'ID': [111, 222, 222, 333, 333, 444, 444, 444, 555, 555, 555, 555],
'Name': ['David','Carl','Carl','Jane','Jane','Mike','Mike','Mike','Jake','Jake','Jake','Jake'],
'LE': ['AAA','AAA','BBB','BBB','CCC','AAA','BBB','CCC','AAA','BBB','CCC','DDD']})
print(df)
ID Name LE
0 111 David AAA
1 222 Carl AAA
2 222 Carl BBB
3 333 Jane BBB
4 333 Jane CCC
5 444 Mike AAA
6 444 Mike BBB
7 444 Mike CCC
8 555 Jake AAA
9 555 Jake BBB
10 555 Jake CCC
11 555 Jake DDD
Чего я хочу
ID Name LE
0 111 David AAA
1 222 Carl BBB
2 333 Jane BBB
3 333 Jane CCC
4 444 Mike BBB
5 444 Mike CCC
6 555 Jake BBB
7 555 Jake CCC
8 555 Jake DDD
В этом случае строка с «David» остается одна, поскольку других экземпляров «David» нет.»
Строка с «Jane» оставлена в покое, поскольку в столбце «Файл» нет экземпляров «AAA».
В остальном все экземпляры с «AAA» в столбце LE удаляются, поскольку в двух других столбцах есть дублирующиеся данные.
Я пытался использовать drop_duplicates (), но это не работает из-за того, что я могу сохранить только одну из повторяющихся строк, если использую эту функциональность. Но в этом случае я хочу удалить только одну конкретную строку для каждого дубликата.
tl; dr Удаляет повторяющиеся строки, только если столбец файла имеет значение ‘AAA’
Комментарии:
1. Вместо изображений поместите редактируемый текст фрейма данных. Было бы легко взять ваши данные и предоставить ответы
2. Спасибо, внес изменения.
Ответ №1:
Вот однострочный —
Первый возвращает логический массив со строками, которые имеют дублированные значения файла, а второй возвращает логический массив со значениями ‘AAA’. Отрицание их amp;
, которое используется для логического индекса df. Наконец, сбросьте и удалите индекс.
df[~(df.duplicated(['LE']) amp; (df['LE']=='AAA'))].reset_index(drop=True)
ID Name LE
0 111 David AAA
1 222 Carl BBB
2 333 Jane BBB
3 333 Jane CCC
4 444 Mike BBB
5 444 Mike CCC
6 555 Jake BBB
7 555 Jake CCC
8 555 Jake DDD
Комментарии:
1. На мой взгляд, это самый питонический способ
Ответ №2:
Я использовал counts_dictionary
для подсчета количества вхождений имен, поскольку идентификатор был уникальным, поэтому не было смысла перебирать их. Затем я перебрал все строки в фрейме данных, и если их количество было больше 1 и было AAA
в LE
столбце, я удалил его
counts_dictionary = {}
for index, row in df.iterrows():
try:
counts_dictionary[row['Name']] = counts_dictionary[row['Name']] 1
except:
counts_dictionary[row['Name']] = 1
for key in counts_dictionary:
for index, row in df.iterrows():
if row['LE'] == 'AAA' and counts_dictionary[row['Name']] > 1:
df.drop(index, inplace=True)
df = df.reset_index(drop=True)