2013-05-09 33 views
9

Hàm pandas factorize gán mỗi giá trị duy nhất trong một chuỗi cho một chỉ mục dựa trên 0, và tính chỉ mục mà mỗi mục nhập thuộc về chuỗi đó.hệ số đa cột trong gấu trúc

Tôi muốn hoàn thành tương đương với pandas.factorize trên nhiều cột:

import pandas as pd 
df = pd.DataFrame({'x': [1, 1, 2, 2, 1, 1], 'y':[1, 2, 2, 2, 2, 1]}) 
pd.factorize(df)[0] # would like [0, 1, 2, 2, 1, 0] 

Đó là, tôi muốn xác định mỗi tuple độc ​​đáo của các giá trị trong nhiều cột của một khung dữ liệu, gán một chỉ số tuần tự để và tính toán chỉ mục mỗi hàng trong khung dữ liệu thuộc về.

Factorize chỉ hoạt động trên các cột đơn lẻ. Có chức năng tương đương đa cột trong gấu trúc không?

+0

kết quả mong muốn của bạn là gì? – waitingkuo

+0

danh sách trong nhận xét - chỉ mục tuần tự duy nhất cho mỗi giá trị khác biệt (x, y) – ChrisB

Trả lời

11

Bạn cần tạo một ô f tuple đầu tiên, pandas.lib.fast_zip có thể làm điều này rất nhanh trong vòng lặp cython.

import pandas as pd 
df = pd.DataFrame({'x': [1, 1, 2, 2, 1, 1], 'y':[1, 2, 2, 2, 2, 1]}) 
print pd.factorize(pd.lib.fast_zip([df.x, df.y]))[0] 

đầu ra là:

[0 1 2 2 1 0] 
+0

Cảm ơn - điều đó mang lại câu trả lời tôi đang tìm kiếm, ở dạng hợp lý nhỏ gọn – ChrisB

0

Bạn có thể sử dụng drop_duplicates để thả những hàng nhân đôi

In [23]: df.drop_duplicates() 
Out[23]: 
     x y 
    0 1 1 
    1 1 2 
    2 2 2 

EDIT

Để đạt được mục tiêu của bạn, bạn có thể tham gia ban đầu của bạn df đến drop_duplicated một:

In [46]: df.join(df.drop_duplicates().reset_index().set_index(['x', 'y']), on=['x', 'y']) 
Out[46]: 
    x y index 
0 1 1  0 
1 1 2  1 
2 2 2  2 
3 2 2  2 
4 1 2  1 
5 1 1  0 
+0

Tôi không tìm cách bỏ chúng, nhưng chỉ định một chỉ mục duy nhất cho mỗi cặp giá trị khác biệt (tức là cuối cùng tôi muốn thêm một cột mới vào khung dữ liệu, với các giá trị [0, 1, 2, 2, 1, 0]). – ChrisB

+0

Tôi đã cập nhật câu trả lời của mình, hiện tại nó có đáp ứng được sự cố của bạn không? – waitingkuo

1

Tôi không chắc chắn nếu đây là một giải pháp hiệu quả. Có thể có giải pháp tốt hơn cho việc này.

arr=[] #this will hold the unique items of the dataframe 
for i in df.index: 
    if list(df.iloc[i]) not in arr: 
     arr.append(list(df.iloc[i])) 

để in arr sẽ cung cấp cho bạn

>>>print arr 
[[1,1],[1,2],[2,2]] 

để giữ chỉ số, tôi sẽ khai báo một mảng ind

ind=[] 
for i in df.index: 
    ind.append(arr.index(list(df.iloc[i]))) 

in ind sẽ cung cấp cho

>>>print ind 
[0,1,2,2,1,0] 
0
df = pd.DataFrame({'x': [1, 1, 2, 2, 1, 1], 'y':[1, 2, 2, 2, 2, 1]}) 
tuples = df[['x', 'y']].apply(tuple, axis=1) 
df['newID'] = pd.factorize(tuples)[0] 
+1

Giải thích mã của bạn –

+0

Vui lòng giải thích mã của bạn khác với OP và cách giải quyết vấn đề. Tôi khuyên bạn nên hướng dẫn này về cách tạo câu trả lời hữu ích https://stackoverflow.com/help/how-to-answer –