2016-10-14 28 views
5

Tôi cần tạo cột bắt đầu bằng giá trị ban đầu và sau đó được tạo bởi hàm bao gồm các giá trị trong quá khứ của cột đó. Ví dụ:Pandas: tạo cột có giá trị tự tham chiếu

df = pd.DataFrame({'a': [1,1,5,2,7,8,16,16,16]}) 
df['b'] = 0 
df.ix[0, 'b'] = 1 
df 

    a b 
0 1 1 
1 1 0 
2 5 0 
3 2 0 
4 7 0 
5 8 0 
6 16 0 
7 16 0 
8 16 0 

Bây giờ, tôi muốn tạo phần còn lại của cột 'b' bằng cách lấy tối thiểu hàng trước đó và thêm hai. Một giải pháp sẽ được

for i in range(1, len(df)): 
    df.ix[i, 'b'] = df.ix[i-1, :].min() + 2 

Hệ quả là đầu ra mong muốn

a b 
0 1 1 
1 1 3 
2 5 3 
3 2 5 
4 7 4 
5 8 6 
6 16 8 
7 16 10 
8 16 12 

Liệu gấu trúc có một cách 'sạch' để làm điều này? Tốt nhất là một trong đó sẽ vector hóa tính toán?

+1

Tôi không thể nghĩ ra cách không liên quan đến lặp lại. Nhưng tôi sẽ nói rằng bạn không phải sử dụng '.ix []'; bạn chỉ có thể có 'df.b [i] = df.iloc [i-1] .min() + 2'. – chrisaycock

Trả lời

5

pandas không có cách nào tuyệt vời để xử lý các phép tính đệ quy chung. Có thể có một số mẹo để vector hóa nó, nhưng nếu bạn có thể lấy sự phụ thuộc, điều này là tương đối không đau và rất nhanh với numba.

@numba.njit 
def make_b(a): 
    b = np.zeros_like(a) 
    b[0] = 1 
    for i in range(1, len(a)): 
     b[i] = min(b[i-1], a[i-1]) + 2 

    return b 

df['b'] = make_b(df['a'].values) 

df 
Out[73]: 
    a b 
0 1 1 
1 1 3 
2 5 3 
3 2 5 
4 7 4 
5 8 6 
6 16 8 
7 16 10 
8 16 12 
Các vấn đề liên quan