Ответ 1
Это намного проще в pandas теперь с 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)
Функция 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.
Это намного проще в pandas теперь с 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)
используйте 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)
Просто хочу добавить к Ben ответ на drop_duplicates:
keep
: {'first,' last, False}, по умолчанию 'first
сначала: удалить дубликаты, кроме первого вхождения.
last: удалить дубликаты, за исключением последнего вхождения.
False: удалить все дубликаты.
Итак, установите keep
в False, мы дадим вам желаемый ответ.
DataFrame.drop_duplicates (* args, ** kwargs) Возвращает DataFrame с дублирующиеся строки удалены, необязательно только с учетом определенных столбцов
Параметры: подмножество: метка столбца или последовательность меток, необязательная Учитывайте только определенные столбцы для идентификации дубликатов, по умолчанию используйте все столбцы: {'first,' last, False}, default 'First first: Drop дубликаты, за исключением первого вхождения. последний: Удалить дубликаты, за исключением последнего вхождения. False: сбросить все дубликаты. take_last: устаревший inplace: boolean, default False Отбрасывать ли дубликаты на место или возвращать копии cols: kwargs только аргумент подмножества [устаревший] Возвраты: дедуплицированный: DataFrame
Собственно, отбрасывать строки 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]
Теперь это намного яснее, поэтому:
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]