Удалить или заменить значения в повторяющихся строках в панде - PullRequest
2 голосов
/ 07 мая 2019

У меня есть фрейм данных df, где некоторые строки являются дубликатами по отношению к подмножеству столбцов:

A    B     C
1    Blue  Green
2    Red   Green
3    Red   Green
4    Blue  Orange
5    Blue  Orange

Я хотел бы удалить (или заменить фиктивной строкой) значения для дублирующихся строк относительно B и C, не удаляя всю строку, в идеале получая:

A    B     C
1    Blue  Green
2    Red   Green
3    NaN   NaN
4    Blue  Orange
5    Nan   NaN

Согласно этой теме: Заменить повторяющиеся значения в столбцах в Pandas Я пытался использовать pd.Series.duplicated, однако не могу заставить его работать с дубликатами в подмножестве столбцов.

Я также играл с:

is_duplicate = df.loc[df.duplicated(subset=['B','C'])]
df = df.where(is_duplicated==True, 999)  # 999 intended as a placeholder that I could find-and-replace later on

Однако это заменяет почти каждую строку на 999 в каждом столбце - так ясно, что я делаю что-то не так. Буду признателен за любые советы о том, как действовать!

Ответы [ 3 ]

2 голосов
/ 07 мая 2019

df.loc[df.duplicated(subset=['B','C']), ['B','C']] = np.nan, кажется, работает для меня.

Отредактировано, чтобы включить коррекцию @ALollz и @ macaw_9227.

1 голос
/ 07 мая 2019

Позвольте мне поделиться с вами тем, как я раньше сталкивался с такими проблемами. Очевидно, что есть более быстрые способы (однострочный), но ради ответа давайте сделаем это на более интуитивном уровне (позже вы увидите, что вы можете сделать это в одну строку).

Итак, поехали ...

df = pd.DataFrame({"B":['Blue','Red','Red','Blue','Blue'],"C":['Green','Green','Green','Orange','Orange']})

, что приводит к

enter image description here

Шаг 1: выявить дублирование:

Для этого я просто добавляю еще один столбец (фасилитатор) и спрашиваю с помощью True / False, если B и C дублируются.

df['IS_DUPLICATED']= df.duplicated(subset=['B','C'])

enter image description here

Шаг 2: Определите индексы 'True' IS_DUPLICATED:

dup_index = df[df['IS_DUPLICATED']==True].index

результат: Int64Index([2, 4], dtype='int64')

Шаг 3: пометить их как Nan:

df.iloc[dup_index]=np.NaN

enter image description here

Шаг 4: удалить столбец IS_DUPLICATED:

df.drop('IS_DUPLICATED',axis=1, inplace=True)

и желаемый результат:

enter image description here

0 голосов
/ 07 мая 2019

Я буду использовать

df[['B','C']]=df[['B','C']].mask(df.duplicated(['B','C']))
df
Out[141]: 
   A     B       C
0  1  Blue   Green
1  2   Red   Green
2  3   NaN     NaN
3  4  Blue  Orange
4  5   NaN     NaN
...