2015-03-05 13 views
5

Tôi muốn mở một tệp, đọc nó, thả các bản sao vào hai cột của tệp và sau đó sử dụng thêm tệp mà không có các bản sao để thực hiện một số phép tính. Để làm điều này tôi đang sử dụng pandas.drop_duplicates, mà sau khi thả các bản sao cũng giảm các giá trị chỉ mục. Ví dụ sau khi droping dòng 1, file1 file2 trở thành:Reindexing after pandas.drop_duplicates

file1: 
    Var1 Var2 Var3 Var4 
0 52  2  3  89 
1 65  2  3  43 
2 15  1  3  78 
3 33  2  4  67 

file2: 
    Var1 Var2 Var3 Var4 
0 52  2  3  89 
2 15  1  3  78 
3 33  2  4  67 

Tiếp tục sử dụng file2 như một dataframe tôi cần phải reindex nó để 0, 1, 2, ...

Đây là mã tôi sử dụng:

file1 = pd.read_csv("filename.txt",sep='|', header=None, names=['Var1', 'Var2', 'Var3', 'Var4']) 
file2 = file1.drop_duplicates(["Var2", "Var3"]) 
# create another variable as a new index: ni 
file2['ni']= range(0, len(file2)) # this is the line that generates the warning 
file2 = file2.set_index('ni') 

Mặc dù mã chạy và tạo ra kết quả tốt, reindexing, cung cấp cho các cảnh báo sau đây:

SettingWithCopyWarning: 
A value is trying to be set on a copy of a slice from a DataFrame. 
Try using .loc[row_indexer,col_indexer] = value instead 

See the the caveats in the documentation: http://pandas.pydata.org/pandas-docs/stable/indexing.html#indexing-view-versus-copy 
    file2['ni']= range(0, len(file2)) 

Tôi đã kiểm tra liên kết nhưng tôi không thể tìm ra cách thay đổi mã của mình. có ý tưởng nào để sửa cái này không?

Trả lời

3

Pandas has a built in function to accomplish this task, mà sẽ cho phép bạn tránh được những lỗi ném bằng phương tiện của một sự thay thế, và đơn giản hơn, cách tiếp cận

Thay vì thêm một cột mới của số thứ tự và sau đó thiết lập các chỉ số để cột đó như bạn đã làm với :

file2['ni']= range(0, len(file2)) # this is the line that generates the warning 
file2 = file2.set_index('ni') 

Bạn thay vì có thể sử dụng:

file2 = file2.reset_index(drop=True) 

hành vi mặc định của .reset_index() là lấy chỉ mục hiện tại, chèn chỉ mục đó làm cột đầu tiên của khung dữ liệu và sau đó tạo chỉ mục mới (tôi giả định logic ở đây là hành vi mặc định làm cho việc so sánh chỉ mục cũ và mới rất dễ dàng, rất hữu ích để kiểm tra sanity). drop=True có nghĩa là thay vì duy trì chỉ mục cũ dưới dạng cột mới, chỉ cần loại bỏ nó và thay thế bằng chỉ mục mới, có vẻ như bạn muốn gì.

tất cả cùng nhau, mã mới của bạn có thể trông như thế này

file1 = pd.read_csv("filename.txt",sep='|', header=None, names=['Var1', 'Var2', 'Var3', 'Var4']) 
file2 = file1.drop_duplicates(["Var2", "Var3"]).reset_index(drop=True) 

See this question as well

Các vấn đề liên quan