Удалить все повторяющиеся строки в Python панды
The pandas
drop_duplicates
функция отлично подходит для" унификации " фрейма данных. Однако одним из ключевых аргументов для передачи является take_last=True
или take_last=False
, в то время как я хотел бы удалить все строки, которые являются дубликатами в подмножестве столбцов. Это возможно?
A B C
0 foo 0 A
1 foo 1 A
2 foo 1 B
3 bar 1 A
в качестве примера, я хотел бы удалить строки, которые совпадают по столбцам A
и C
так что это должно отбросить строки 0 и 1.
5 ответов:
это гораздо проще в панд теперь с drop_duplicates и параметр keep.
import pandas as pd df = pd.DataFrame({"A":["foo", "foo", "foo", "bar"], "B":[0,1,1,1], "C":["A","A","B","A"]}) df.drop_duplicates(subset=['A', 'C'], keep=False)
просто хочу добавить к ответу Бена на drop_duplicates:
keep
: {'first',’ last', False}, по умолчанию 'first'
во-первых: удаление дубликатов, за исключением первого вхождения.
last: удаление дубликатов, за исключением последнего вхождения.
False: удалить все дубликаты.
поэтому ставим
keep
ложь мы даем вам нужные ответ.таблицы данных.drop_duplicates (*args, **kwargs) возвращает фрейм данных с дубликаты строк удаляются, необязательно только с учетом определенных столбцов
параметры: подмножество: метка столбца или последовательность меток, необязательно По умолчанию следует учитывать только определенные столбцы для идентификации дубликатов используйте все столбцы keep: {‘first’, ‘last’, False}, default ’ first ' first: отбросьте дубликаты, за исключением первого вхождения. последний : Удаление дубликатов, за исключением для последнего случая. False: отбросить все дубликаты. take_last: deprecated inplace: boolean, default False Нужно ли удалять дубликаты на месте или возвращать копию cols : kwargs только аргумент subset [deprecated] возвращает: дедуплицированный : Таблицы данных
использовать
groupby
иfilter
import pandas as pd df = pd.DataFrame({"A":["foo", "foo", "foo", "bar"], "B":[0,1,1,1], "C":["A","A","B","A"]}) df.groupby(["A", "C"]).filter(lambda df:df.shape[0] == 1)
если вы хотите, чтобы результат был сохранен в другом наборе данных:
df.drop_duplicates(keep=False)
или
df.drop_duplicates(keep=False, inplace=False)
Если же набор данных нуждается в обновлении:
df.drop_duplicates(keep=False, inplace=True)
выше примеры удалят все дубликаты и сохранить один, похожий на
DISTINCT *
в SQL
на самом деле, drop строк 0 и 1 требуется только (любые наблюдения, содержащие совпадающие A и C сохраняется.):
In [335]: df['AC']=df.A+df.C In [336]: print df.drop_duplicates('C', take_last=True) #this dataset is a special case, in general, one may need to first drop_duplicates by 'c' and then by 'a'. A B C AC 2 foo 1 B fooB 3 bar 1 A barA [2 rows x 4 columns]
но я подозреваю, что вы действительно хотите этого (одно наблюдение, содержащее совпадающие A и C, сохраняется.):
In [337]: print df.drop_duplicates('AC') A B C AC 0 foo 0 A fooA 2 foo 1 B fooB 3 bar 1 A barA [3 rows x 4 columns]
Edit:
Теперь это гораздо яснее, таким образом:
In [352]: DG=df.groupby(['A', 'C']) print pd.concat([DG.get_group(item) for item, value in DG.groups.items() if len(value)==1]) A B C 2 foo 1 B 3 bar 1 A [2 rows x 3 columns]