Thả tất cả các hàng trùng lặp trong Pandas Python


159

Các pandas drop_duplicateschức năng là rất tốt cho "uniquifying" một dataframe. Tuy nhiên, một trong những đối số từ khóa cần chuyển là take_last=Truehoặc take_last=False, trong khi tôi muốn bỏ tất cả các hàng trùng lặp trên một tập hợp con của các cột. Điều này có thể không?

    A   B   C
0   foo 0   A
1   foo 1   A
2   foo 1   B
3   bar 1   A

Ví dụ, tôi muốn thả các hàng khớp với các cột ACvì vậy điều này sẽ thả các hàng 0 và 1.

Câu trả lời:


233

Điều này dễ dàng hơn nhiều trong gấu trúc bây giờ với drop_d repeatates và tham số 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)

2
Nếu cột của tôi không được dán nhãn rõ ràng thì sao? Làm cách nào để chọn các cột chỉ dựa trên chỉ mục của chúng?
Hamman Samuel

2
Có lẽ df.reindex(df.iloc[:,[0,2]].drop_duplicates(keep=False).index)nào?
Ben

5
bạn có thể thửdf.drop_duplicates(subset=[df.columns[0:2]], keep = False)
seeiespi

67

Chỉ muốn thêm vào câu trả lời của Ben trên drop_d repeatates :

keep : {'đầu tiên', 'cuối cùng', Sai}, mặc định 'đầu tiên'

  • đầu tiên: Thả các bản sao trừ lần xuất hiện đầu tiên.

  • cuối cùng: Thả các bản sao trừ lần xuất hiện cuối cùng.

  • Sai: Thả tất cả các bản sao.

Vì vậy, thiết lập keepthành Sai sẽ cho bạn câu trả lời mong muốn.

DataFrame.drop_d repeatates (* args, ** kwargs) Trả về DataFrame với các hàng trùng lặp được loại bỏ, tùy chọn chỉ xem xét các cột nhất định

Tham số: tập hợp con: nhãn cột hoặc chuỗi nhãn, tùy chọn Chỉ xem xét các cột nhất định để xác định trùng lặp, theo mặc định sử dụng tất cả các cột giữ: {'đầu tiên', 'cuối', Sai}, mặc định 'đầu tiên': Bỏ trùng lặp ngoại trừ cho lần xuất hiện đầu tiên cuối cùng: Thả các bản sao trừ lần xuất hiện cuối cùng. Sai: Thả tất cả các bản sao. Take_last: deprecated inplace: boolean, default Sai Cho dù thả các bản sao vào vị trí hoặc trả về một bản sao cols: kwargs chỉ đối số của tập hợp con [deprecated] Trả về: dep repeatated: DataFrame


25

Nếu bạn muốn kết quả được lưu trữ trong tập dữ liệu khác:

df.drop_duplicates(keep=False)

hoặc là

df.drop_duplicates(keep=False, inplace=False)

Nếu cùng một bộ dữ liệu cần được cập nhật:

df.drop_duplicates(keep=False, inplace=True)

Các ví dụ trên sẽ loại bỏ tất cả các bản sao và giữ một bản, tương tự như DISTINCT *trong SQL


11

sử dụng groupbyfilter

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)

4

Trên thực tế, chỉ cần thả hàng 0 và 1 (mọi quan sát có chứa A và C khớp nhau được giữ lại.):

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]

Nhưng tôi nghi ngờ những gì bạn thực sự muốn là điều này (một quan sát có chứa A và C phù hợp được giữ lại.):

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]

Biên tập:

Bây giờ nó rõ ràng hơn nhiều, do đó:

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]

1
Nếu đó là những gì tôi muốn, tôi chỉ sử dụng df.drop_duplicates(['A','C'])làm mặc định giữ cho một quan sát thực hiện đầu tiên hoặc cuối cùng như tôi đã đề cập trong câu hỏi - mặc dù tôi vừa nhận ra mình đã mắc từ khóa sai khi viết từ bộ nhớ. Điều tôi muốn là bỏ tất cả các hàng giống hệt nhau trên các cột quan tâm (A và C trong dữ liệu ví dụ).
Jamie Bull

-1

Hãy thử những thứ khác nhau

df = pd.DataFrame({"A":["foo", "foo", "foo", "bar","foo"], "B":[0,1,1,1,1], "C":["A","A","B","A","A"]})

>>>df.drop_duplicates( "A" , keep='first')

hoặc là

>>>df.drop_duplicates( keep='first')

hoặc là

>>>df.drop_duplicates( keep='last')
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.