2014-10-30 27 views
37

Tôi đang cố gắng truy cập chỉ mục của một hàng trong một hàm được áp dụng trên toàn bộ DataFrame trong Pandas. Tôi có một cái gì đó như thế này:lấy chỉ mục của một hàng trong gấu trúc áp dụng hàm

df = pandas.DataFrame([[1,2,3],[4,5,6]], columns=['a','b','c']) 
>>> df 
    a b c 
0 1 2 3 
1 4 5 6 

và tôi sẽ định nghĩa một hàm truy cập vào các yếu tố với một hàng cho

def rowFunc(row): 
    return row['a'] + row['b'] * row['c'] 

tôi có thể áp dụng nó như vậy:

df['d'] = df.apply(rowFunc, axis=1) 
>>> df 
    a b c d 
0 1 2 3 7 
1 4 5 6 34 

Awesome! Bây giờ nếu tôi muốn kết hợp chỉ mục vào chức năng của mình thì sao? Chỉ mục của bất kỳ hàng cụ thể nào trong số DataFrame trước khi thêm d sẽ là Index([u'a', u'b', u'c', u'd'], dtype='object'), nhưng tôi muốn 0 và 1. Vì vậy, tôi không thể truy cập row.index.

Tôi biết tôi có thể tạo ra một cột tạm thời trong bảng nơi tôi lưu trữ các chỉ số, nhưng tôi "tự hỏi nếu nó được sotred trong đối tượng hàng ở đâu đó.

+1

Bên cạnh: là có một lý do bạn cần phải sử dụng 'apply'? Đó là chậm hơn nhiều so với thực hiện ops vectorized trên khung chính nó. (Đôi khi áp dụng * là * cách đơn giản nhất để làm điều gì đó và cân nhắc hiệu suất thường được phóng đại, nhưng đối với ví dụ cụ thể của bạn thì dễ dàng * không * để sử dụng nó.) – DSM

+1

@ DSM trong thực tế Tôi đang gọi một hàm tạo đối tượng khác cho mỗi hàng sử dụng các yếu tố hàng khác nhau. Tôi chỉ muốn đặt một ví dụ tối thiểu với nhau để minh họa cho câu hỏi. – Mike

+0

'apply()' không phải là droid bạn đang tìm kiếm; sử dụng 'df.iterrows()' để thay thế. Xem câu trả lời của tôi. Đây là loại vấn đề XY – smci

Trả lời

45

Để truy cập vào các chỉ số trong trường hợp này, bạn truy cập vào name thuộc tính:

In [182]: 

df = pd.DataFrame([[1,2,3],[4,5,6]], columns=['a','b','c']) 
def rowFunc(row): 
    return row['a'] + row['b'] * row['c'] 

def rowIndex(row): 
    return row.name 
df['d'] = df.apply(rowFunc, axis=1) 
df['rowIndex'] = df.apply(rowIndex, axis=1) 
df 
Out[182]: 
    a b c d rowIndex 
0 1 2 3 7   0 
1 4 5 6 34   1 

Lưu ý rằng nếu điều này thực sự là những gì bạn đang cố gắng để làm điều đó các công trình sau đây và nhanh hơn nhiều:

In [198]: 

df['d'] = df['a'] + df['b'] * df['c'] 
df 
Out[198]: 
    a b c d 
0 1 2 3 7 
1 4 5 6 34 

In [199]: 

%timeit df['a'] + df['b'] * df['c'] 
%timeit df.apply(rowIndex, axis=1) 
10000 loops, best of 3: 163 µs per loop 
1000 loops, best of 3: 286 µs per loop 
+0

Cảnh báo cho bất kỳ ai khác ở đây. Tôi nghĩ rằng chỉ mục mà bạn nhận được từ 'row.name' là chỉ mục số của hàng. Nếu bạn có một chỉ mục tùy chỉnh (nói một chuỗi UUID cho mỗi hàng), bạn không thể truy cập nó bên trong 'apply'. Thêm nhầm lẫn, đối với hàng 'n',' df.iloc [n] .name' sẽ trả về UUID của hàng n bên ngoài 'apply', nhưng bên trong' apply' 'row.name' sẽ trả về' n' ... Xem : http://stackoverflow.com/questions/18316211/access-index-in-pandas-series-apply – Owen

+2

@Owen trong câu hỏi được liên kết, đó là một 'Dòng' không phải là một df, cho một Chuỗi bạn không thể truy cập giá trị chỉ mục như thế này, bạn có thể cho một df. Đối với một chuỗi bạn cần chuyển đổi thành DataFrame, hãy xem câu trả lời của Jeff, bạn cũng có thể thực hiện 'to_frame()' trên chuỗi – EdChum

0

apply() không phải là droid bạn đang tìm kiếm.

DataFrame.iterrows() cho phép bạn duyệt qua hàng, và truy cập vào tên của họ:

for name, row in df.iterrows(): 
    ... 
Các vấn đề liên quan