Tôi có một số vấn đề với hàm áp dụng Pandas, khi sử dụng nhiều cột với khung dữ liệu sau
df = DataFrame ({'a' : np.random.randn(6),
'b' : ['foo', 'bar'] * 3,
'c' : np.random.randn(6)})
và các chức năng sau đây
def my_test(a, b):
return a % b
Khi tôi cố gắng áp dụng chức năng này với:
df['Value'] = df.apply(lambda row: my_test(row[a], row[c]), axis=1)
Tôi nhận được thông báo lỗi:
NameError: ("global name 'a' is not defined", u'occurred at index 0')
Tôi không hiểu tin nhắn này, tôi đã xác định đúng tên.
Tôi đánh giá cao bất kỳ sự giúp đỡ nào về vấn đề này
Cập nhật
Cảm ơn bạn đã giúp đỡ. Tôi thực sự đã thực hiện một số lỗi cú pháp với mã, chỉ mục nên được đặt ''. Tuy nhiên tôi vẫn gặp vấn đề tương tự khi sử dụng một hàm phức tạp hơn, chẳng hạn như:
def my_test(a):
cum_diff = 0
for ix in df.index():
cum_diff = cum_diff + (a - df['a'][ix])
return cum_diff
my_test(a)
không biết điều gì df
vì nó không được thông qua dưới dạng đối số (trừ khi df
được cho là toàn cầu, đây sẽ là một thực tiễn khủng khiếp). Bạn cần chuyển tất cả các giá trị bạn sẽ cần bên trong một hàm dưới dạng đối số (tốt nhất là theo thứ tự), nếu không thì hàm sẽ biết df
nguồn gốc từ đâu? Ngoài ra, đó là cách thực hành tồi để lập trình trong một không gian tên chứa đầy các biến toàn cục, bạn sẽ không gặp phải các lỗi như thế này.
apply
càng nhiều càng tốt. Nếu bạn không chắc chắn bạn cần sử dụng nó, có lẽ bạn không nên. Tôi khuyên bạn nên xem khi nào tôi nên sử dụng gấu trúc áp dụng () trong mã của mình? .