2017-05-16 24 views
9

Tôi có một Dataframe:Pandas yếu tố khôn ngoan phút tối đa chống lại một loạt dọc theo một trục

df = 
      A B C D 
DATA_DATE 
20170103 5.0 3.0 NaN NaN 
20170104 NaN NaN NaN 1.0 
20170105 1.0 NaN 2.0 3.0 

Và tôi có một loạt

s = 
DATA_DATE 
20170103 4.0 
20170104 0.0 
20170105 2.2 

tôi muốn chạy một yếu tố khôn ngoan max() chức năng và căn chỉnh s dọc theo các cột của df. Nói cách khác, tôi muốn nhận được

result = 
      A B C D 
DATA_DATE 
20170103 5.0 4.0 NaN NaN 
20170104 NaN NaN NaN 1.0 
20170105 2.2 NaN 2.2 3.0 

Cách tốt nhất để làm điều này là gì? Tôi đã kiểm tra single column comparisonseries to series comparison nhưng chưa tìm thấy cách hiệu quả để chạy khung dữ liệu theo chuỗi.

Bonus: Không chắc nếu câu trả lời sẽ là hiển nhiên từ trên cao, nhưng làm thế nào để làm điều đó nếu tôi muốn sắp xếp s dọc theo hàng của df (giả định kích thước phù hợp)?

Trả lời

8

dữ liệu:

In [135]: df 
Out[135]: 
      A B C D 
DATA_DATE 
20170103 5.0 3.0 NaN NaN 
20170104 NaN NaN NaN 1.0 
20170105 1.0 NaN 2.0 3.0 

In [136]: s 
Out[136]: 
20170103 4.0 
20170104 0.0 
20170105 2.2 
Name: DATA_DATE, dtype: float64 

Giải pháp:

In [66]: df.clip_lower(s, axis=0) 
C:\Users\Max\Anaconda4\lib\site-packages\pandas\core\ops.py:1247: RuntimeWarning: invalid value encountered in greater_equal 
    result = op(x, y) 
Out[66]: 
      A B C D 
DATA_DATE 
20170103 5.0 4.0 NaN NaN 
20170104 NaN NaN NaN 1.0 
20170105 2.2 NaN 2.2 3.0 

chúng ta có thể sử dụng dãy lệnh theo đây để GED thoát khỏi RuntimeWarning:

In [134]: df.fillna(np.inf).clip_lower(s, axis=0).replace(np.inf, np.nan) 
Out[134]: 
      A B C D 
DATA_DATE 
20170103 5.0 4.0 NaN NaN 
20170104 NaN NaN NaN 1.0 
20170105 2.2 NaN 2.2 3.0 
+1

Sạch hơn nhiều. :) – ayhan

+0

@ayhan, cảm ơn bạn! :-) – MaxU

+0

Tôi đang cố gắng để tái tạo câu trả lời nhưng tôi nhận được một loạt các giá trị Nan. Bất kỳ ý tưởng những gì tôi có thể làm sai? – Moondra

6

này được gọi là phát thanh truyền hình và có thể được thực hiện như sau:

import numpy as np 
np.maximum(df, s[:, None]) 
Out: 
      A B C D 
DATA_DATE      
20170103 5.0 4.0 NaN NaN 
20170104 NaN NaN NaN 1.0 
20170105 2.2 NaN 2.2 3.0 

Ở đây, s[:, None] sẽ thêm một trục mới để s. Điều tương tự cũng có thể đạt được bằng s[:, np.newaxis]. Khi bạn thực hiện việc này, chúng có thể được phát cùng nhau vì các hình dạng (3, 4)(3, 1) có một yếu tố chung.

Lưu ý sự khác biệt giữa ss[:, None]:

s.values 
Out: array([ 4. , 0. , 2.2]) 

s[:, None] 
Out: 
array([[ 4. ], 
     [ 0. ], 
     [ 2.2]]) 

s.shape 
Out: (3,) 

s[:, None].shape 
Out: (3, 1) 

Một thay thế sẽ là:

df.mask(df.le(s, axis=0), s, axis=0) 

Out: 
      A B C D 
DATA_DATE      
20170103 5.0 4.0 NaN NaN 
20170104 NaN NaN NaN 1.0 
20170105 2.2 NaN 2.2 3.0 

này lần đọc: So sánh df và s. Trường hợp df lớn hơn, hãy sử dụng df và sử dụng s.

+1

Đừng tự bán mình @ayhan, đây là một câu trả lời tuyệt vời. Đã học về phát thanh truyền hình và so sánh một chuỗi với một khung dữ liệu. Cảm ơn bạn! – pshep123

+0

@ pshep123 Cảm ơn bạn. :) – ayhan

0

Trong khi có thể có giải pháp tốt hơn cho vấn đề của bạn, tôi tin rằng điều này sẽ cung cấp cho bạn những gì bạn cần:

for c in df.columns: 
    df[c] = pd.concat([df[c], s], axis=1).max(axis=1) 
Các vấn đề liên quan