2016-11-17 31 views
6

Tôi có hai khung dữ liệu chỉ có các cột và cột chồng lấp nhau.Các số NaN khi trừ các khung dữ liệu pandas

old = pd.DataFrame(index = ['A', 'B', 'C'], 
        columns = ['k', 'l', 'm'], 
        data = abs(np.floor(np.random.rand(3, 3)*10))) 

new = pd.DataFrame(index = ['A', 'B', 'C', 'D'], 
        columns = ['k', 'l', 'm', 'n'], 
        data = abs(np.floor(np.random.rand(4, 4)*10))) 

tôi muốn để tính toán sự khác biệt giữa họ và cố gắng

delta = new - old 

Điều này cho phép nhiều Nans nơi chỉ số và cột không khớp. Tôi muốn đối xử với sự quan tâm của các chỉ số và cột như số không, (tuổi ['n', 'D'] = 0). cũ sẽ luôn là một không gian con mới.

Bất kỳ ý tưởng nào?

CHỈNH SỬA: Tôi đoán tôi đã không giải thích đầy đủ. Tôi không muốn điền vào các dataframe delta với zeroes. Tôi muốn đối xử với các chỉ mục và cột bị thiếu trong cũ như thể chúng là số không. Sau đó tôi sẽ nhận được giá trị trong ['n', 'D'] mới ở vùng đồng bằng thay vì một NaN.

+1

gọi 'đồng bằng = delta.fillna (0) 'để thay thế nan đánh giá cao – EdChum

+0

Tôi đoán tôi đã không giải thích nó hoàn toàn đủ. Tôi không muốn điền vào các dataframe delta với zeroes. Tôi muốn đối xử với các chỉ mục và cột bị thiếu trong cũ như thể chúng là số không. Sau đó tôi sẽ nhận được giá trị trong ['n', 'D'] mới ở vùng đồng bằng thay vì một NaN. –

+0

Tôi sẽ mở lại một khi tôi trở lại máy tính, về cơ bản những gì bạn muốn làm là lấy liên minh của cả hai cột dfs và chỉ mục, reindex cả dfs và điền nan với số không và sau đó trừ – EdChum

Trả lời

5

Sử dụng sub với fill_value=0:

In [15]: 
old = pd.DataFrame(index = ['A', 'B', 'C'], 
        columns = ['k', 'l', 'm'], 
        data = abs(np.floor(np.random.rand(3, 3)*10))) 
​ 
new = pd.DataFrame(index = ['A', 'B', 'C', 'D'], 
        columns = ['k', 'l', 'm', 'n'], 
        data = abs(np.floor(np.random.rand(4, 4)*10))) 
delta = new.sub(old, fill_value=0) 
delta 

Out[15]: 
    k l m n 
A 0 3 -9 7 
B 0 -2 1 8 
C -4 1 1 7 
D 8 6 0 6 
+0

Làm việc như một sự quyến rũ! Cảm ơn bạn! –

+0

không phải lo lắng bạn có thể chấp nhận câu trả lời của tôi, sẽ có một dấu tích trống ở phía trên bên trái của câu trả lời của tôi – EdChum

+0

tương đương với: '(mới - cũ) .fillna (0)' – dmeu

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