2016-06-13 54 views
8

Tôi đã cập nhật câu hỏi của mình để cung cấp ví dụ rõ ràng hơn.Pandas drop_duplicates - TypeError: nhập đối số đối tượng sau * phải là một chuỗi, chứ không phải bản đồ

Có thể sử dụng phương thức drop_duplicates trong Pandas để loại bỏ các hàng trùng lặp dựa trên một id cột trong đó các giá trị chứa một danh sách. Xem xét cột 'ba' bao gồm hai mục trong danh sách. Có cách nào để thả các hàng trùng lặp hơn là làm nó lặp đi lặp lại (đó là cách giải quyết hiện tại của tôi).

tôi đã nêu vấn đề của tôi bằng cách cung cấp các ví dụ sau:

import pandas as pd 

data = [ 
{'one': 50, 'two': '5:00', 'three': 'february'}, 
{'one': 25, 'two': '6:00', 'three': ['february', 'january']}, 
{'one': 25, 'two': '6:00', 'three': ['february', 'january']}, 
{'one': 25, 'two': '6:00', 'three': ['february', 'january']}, 
{'one': 90, 'two': '9:00', 'three': 'january'} 
] 

df = pd.DataFrame(data) 

print(df) 

    one    three two 
0 50    february 5:00 
1 25 [february, january] 6:00 
2 25 [february, january] 6:00 
3 25 [february, january] 6:00 
4 90    january 9:00 

df.drop_duplicates(['three']) 

Kết quả trong các lỗi sau:

TypeError: type object argument after * must be a sequence, not map 
+1

bạn muốn 'df_two = df_one.drop_duplicates ('ID') 'hoặc cụ thể' df_two = df_one.drop_duplicates (tập hợp con = [ 'ID'])' – EdChum

+0

sợ rằng chưa giải quyết được vấn đề. vẫn nhìn thấy cùng một lỗi – user3939059

+0

do đó, không hoạt động 'df_two = df_one.drop_duplicates()'? – EdChum

Trả lời

15

Tôi nghĩ rằng đó là vì các loại danh sách là không hashable và đó là rối tung lên logic trùng lặp. Là một workaround bạn có thể cast vào tuple như vậy:

df['four'] = df['three'].apply(lambda x : tuple(x) if type(x) is list else x) 
df.drop_duplicates('four') 

    one    three two     four 
0 50    february 5:00    february 
1 25 [february, january] 6:00 (february, january) 
4 90    january 9:00    january 
Các vấn đề liên quan