2012-05-23 66 views
24

Tôi có một số DataFrame với một vài cột. Một cột có chứa một biểu tượng mà tiền tệ đang được sử dụng, ví dụ như một đồng euro hoặc một dấu đô la. Một cột khác chứa giá trị ngân sách. Vì vậy, ví dụ trong một hàng nó có thể có nghĩa là một ngân sách 5000 euro và trong hàng kế tiếp nó có thể nói một ngân sách 2000 đô la.Điều kiện giá trị cột điền dựa trên giá trị cột khác trong gấu trúc

Trong gấu trúc, tôi muốn thêm cột bổ sung vào DataFrame, bình thường hóa ngân sách bằng đồng euro. Về cơ bản, đối với mỗi hàng, giá trị trong cột mới phải là giá trị từ cột ngân sách * 1 nếu biểu tượng trong cột tiền tệ là ký hiệu đồng euro và giá trị trong cột mới phải là giá trị của cột ngân sách * 0.78125 nếu biểu tượng trong cột tiền tệ là ký hiệu đô la.

Tôi biết cách thêm cột, điền vào giá trị, sao chép giá trị từ cột khác, v.v. không phải cách điền cột mới có điều kiện dựa trên giá trị của cột khác.

Mọi đề xuất?

Trả lời

45

Bạn có thể muốn làm

df['Normalized'] = np.where(df['Currency'] == '$', df['Budget'] * 0.78125, df['Budget']) 
+1

Có thể làm điều gì đó như thế này nhưng với các từ thay vì số? –

5

Kết quả tương tự thông qua một phong cách thay thế có thể viết một hàm thực hiện các hoạt động mà bạn muốn trên một hàng, sử dụng row['fieldname'] cú pháp để truy cập vào các giá trị cá nhân/cột, và sau đó thực hiện một phương pháp DataFrame.apply khi nó

đây là sự lặp câu trả lời cho câu hỏi liên quan ở đây: pandas create new column based on values from other columns

def normalise_row(row): 
    if row['Currency'] == '$' 
    ... 
    ... 
    ... 
    return result 

df['Normalized'] = df.apply(lambda row : normalise_row, axis=1) 
1

Lấy đề xuất của Tom Kimber thêm một bước nữa, bạn có thể sử dụng từ điển chức năng để đặt các điều kiện khác nhau cho các chức năng của bạn. Giải pháp này đang mở rộng phạm vi của câu hỏi.

Tôi đang sử dụng ví dụ từ ứng dụng cá nhân.

# write the dictionary 

def applyCalculateSpend (df_name, cost_method_col, metric_col, rate_col, total_planned_col): 
    calculations = { 
      'CPMV' : df_name[metric_col]/1000 * df_name[rate_col], 
      'Free' : 0 
      } 
    df_method = df_name[cost_method_col] 
    return calculations.get(df_method, "not in dict") 

# call the function inside a lambda 

test_df['spend'] = test_df.apply(lambda row: applyCalculateSpend(
row, 
cost_method_col='cost method', 
metric_col='metric', 
rate_col='rate', 
total_planned_col='total planned'), axis = 1) 

    cost method metric rate total planned spend 
0  CPMV 2000 100   1000 200.0 
1  CPMV 4000 100   1000 400.0 
4  Free  1  2    3 0.0 
Các vấn đề liên quan