2016-07-26 22 views
14

np.where có ngữ nghĩa của một véc tơ nếu/else (tương tự như phương pháp của Apache Spark when/otherwise DataFrame). Tôi biết rằng tôi có thể sử dụng np.where trên gấu trúc Series, nhưng pandas thường xác định API riêng của mình để sử dụng thay vì các hàm numpy thô, thường thuận tiện hơn với pd.Series/pd.DataFrame.gấu trúc tương đương với np.where

Chắc chắn đủ, tôi đã tìm thấy pandas.DataFrame.where. Tuy nhiên, ngay từ cái nhìn đầu tiên, nó có một ngữ nghĩa hoàn toàn khác. Tôi không thể tìm thấy một cách để viết lại ví dụ cơ bản nhất của np.where sử dụng gấu trúc where:

# df is pd.DataFrame 
# how to write this using df.where? 
df['C'] = np.where((df['A']<0) | (df['B']>0), df['A']+df['B'], df['A']/df['B']) 

Am tôi thiếu một cái gì đó rõ ràng? Hoặc là gấu trúc where dành cho trường hợp sử dụng hoàn toàn khác, mặc dù có cùng tên là np.where?

+0

Chuỗi tài liệu http://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.where.html dường như giải thích một cách hợp lý (mặc dù nó có thể sử dụng một hoặc hai ví dụ). Chú ý đến mô tả ngắn và mô tả các đối số 'cond' và' other', nhưng bỏ qua tùy chọn cho các đối số này để có thể gọi được. –

+0

@WarrenWeckesser Vào lần đọc thứ hai của các tài liệu, tôi nghĩ rằng tôi đã nhận nó ... Nó giống như '(df.A + df.B) .where ((df ['A'] <0) | (df [' B ']> 0), df.A/df.B) ', phải không? Tôi sẽ xóa câu hỏi của tôi. – max

+3

@max: Không xóa. Điều này có thể sẽ giúp ai đó trong tương lai. – bernie

Trả lời

15

Hãy thử:

(df['A'] + df['B']).where((df['A'] < 0) | (df['B'] > 0), df['A']/df['B']) 

Sự khác biệt giữa numpywhereDataFramewhere là các giá trị mặc định được cung cấp bởi các DataFrame rằng phương pháp where đang được kêu gọi (docs).

I.e.

np.where(m, A, B) 

là tương đương với

A.where(m, B) 

Nếu bạn muốn có một chữ ký cuộc gọi tương tự như sử dụng gấu trúc, bạn có thể tận dụng lợi thế của the way method calls work in Python:

pd.DataFrame.where(cond=(df['A'] < 0) | (df['B'] > 0), self=df['A'] + df['B'], other=df['A']/df['B']) 

hoặc không kwargs (Lưu ý: rằng thứ tự vị trí của đối số khác với số numpywhereargument order):

pd.DataFrame.where(df['A'] + df['B'], (df['A'] < 0) | (df['B'] > 0), df['A']/df['B']) 
+1

@piRSquared Chỉ cần đọc qua câu trả lời 'groupby'' agg' của bạn/câu trả lời của @ unutbu và đang nghĩ về điều tương tự! – Alex

+0

nếu bạn muốn hiển thị một ví dụ trong chuỗi tài liệu sẽ là một đóng góp lớn! – Jeff

+0

@Jeff Chỉ cần gửi PR. Bạn có bất kỳ tài nguyên nào để hiểu cấu trúc mã nguồn của gấu trúc ở mức cao (ví dụ: tài liệu/bài đăng còn tồn tại trên diễn đàn dành cho nhà phát triển) không? Tôi đọc qua các tài liệu đóng góp/phát triển mà tôi đã tìm thấy và không thấy bất kỳ điều gì giống với loại xem mã nguồn 5000-ft này. – Alex

Các vấn đề liên quan