2012-08-03 44 views
7

Tôi có một Pandas DataFrame với bốn cột, A, B, C, D. Đôi khi, các giá trị của BC có thể là 0. Vì vậy, tôi muốn để có được những điều sau đây:Pandas DataFrame Áp dụng

B[i] = B[i] if B[i] else min(A[i], D[i]) 
C[i] = C[i] if C[i] else max(A[i], D[i]) 

nơi tôi đã sử dụng i để chỉ chạy trên tất cả các hàng của khung. Với Pandas, bạn có thể dễ dàng tìm thấy các hàng có chứa 0 cột:

df[df.B == 0] and df[df.C == 0] 

tuy nhiên tôi không biết làm thế nào để dễ dàng thực hiện chuyển đổi trên. Tôi có thể nghĩ ra các phương pháp không hiệu quả và không hiệu quả (for vòng trên toàn bộ khung hình) nhưng không có gì đơn giản.

Trả lời

8

Kết hợp lập chỉ mục boolean và áp dụng có thể thực hiện thủ thuật. Bên dưới ví dụ về thay thế phần tử 0 cho cột C.

In [22]: df 
Out[22]: 
    A B C D 
0 8 3 5 8 
1 9 4 0 4 
2 5 4 3 8 
3 4 8 5 1 

In [23]: bi = df.C==0 

In [24]: df.ix[bi, 'C'] = df[bi][['A', 'D']].apply(max, axis=1) 

In [25]: df 
Out[25]: 
    A B C D 
0 8 3 5 8 
1 9 4 9 4 
2 5 4 3 8 
3 4 8 5 1 
+1

Khá gọn gàng. Tuy nhiên, tôi nghĩ rằng bạn có thể loại bỏ '.max (axis = 1)' thay vì 'apply (...)'. –

+0

'max()' là ok quá tất nhiên, tôi nghĩ rằng tôi đã thiên về 'áp dụng' bằng cách bạn hỏi câu hỏi :-) –

2

Thử phương pháp lớp DataFrame 'iterrows' để lặp lại hiệu quả thông qua các hàng của một DataFrame.See chương 6.7.2 của hướng dẫn gấu trúc 0.8.1.

from pandas import * 
import numpy as np 

df = DataFrame({'A' : [5,6,3], 'B' : [0,0,0], 'C':[0,0,0], 'D' : [3,4,5]}) 

for idx, row in df.iterrows(): 
    if row['B'] == 0: 
     row['B'] = min(row['A'], row['D']) 
    if row['C'] == 0: 
     row['C'] = min(row['A'], row['D']) 
Các vấn đề liên quan