2015-10-08 27 views
5

Tôi có hai dataframes (df1 và df2) mà mỗi khung dữ liệu có cùng hàng và cột. Tôi muốn lấy tối đa hai khung dữ liệu này, phần tử theo phần tử. Ngoài ra, kết quả của bất kỳ yếu tố tối đa khôn ngoan với một số và NaN phải là số. Cách tiếp cận mà tôi đã triển khai cho đến nay dường như không hiệu quả:Tối đa yếu tố của hai DataFrames bỏ qua NaNs

def element_max(df1,df2): 
    import pandas as pd 
    cond = df1 >= df2 
    res = pd.DataFrame(index=df1.index, columns=df1.columns) 
    res[(df1==df1)&(df2==df2)&(cond)] = df1[(df1==df1)&(df2==df2)&(cond)] 
    res[(df1==df1)&(df2==df2)&(~cond)] = df2[(df1==df1)&(df2==df2)&(~cond)] 
    res[(df1==df1)&(df2!=df2)&(~cond)] = df1[(df1==df1)&(df2!=df2)] 
    res[(df1!=df1)&(df2==df2)&(~cond)] = df2[(df1!=df1)&(df2==df2)] 
    return res 

Bất kỳ ý tưởng nào khác? Cảm ơn bạn đã dành thời gian.

+0

Hãy thêm ít nhất một mẫu của các dataframe gốc để tái tạo vấn đề của bạn. –

Trả lời

9

Bạn có thể sử dụng để kiểm tra where df của bạn chống lại một df, nơi điều kiện là True, các giá trị từ df được trả về, khi sai các giá trị từ df1 được trả về. Ngoài ra trong trường hợp NaN giá trị trong df1 sau đó là một cuộc gọi bổ sung cho fillna(df) sẽ sử dụng các giá trị từ df để lấp đầy những NaN và trả lại df mong muốn:

In [178]: 
df = pd.DataFrame(np.random.randn(5,3)) 
df.iloc[1,2] = np.NaN 
print(df) 
df1 = pd.DataFrame(np.random.randn(5,3)) 
df1.iloc[0,0] = np.NaN 
print(df1) 

      0   1   2 
0 2.671118 1.412880 1.666041 
1 -0.281660 1.187589  NaN 
2 -0.067425 0.850808 1.461418 
3 -0.447670 0.307405 1.038676 
4 -0.130232 -0.171420 1.192321 
      0   1   2 
0  NaN -0.244273 -1.963712 
1 -0.043011 -1.588891 0.784695 
2 1.094911 0.894044 -0.320710 
3 -1.537153 0.558547 -0.317115 
4 -1.713988 -0.736463 -1.030797 

In [179]: 
df.where(df > df1, df1).fillna(df) 

Out[179]: 
      0   1   2 
0 2.671118 1.412880 1.666041 
1 -0.043011 1.187589 0.784695 
2 1.094911 0.894044 1.461418 
3 -0.447670 0.558547 1.038676 
4 -0.130232 -0.171420 1.192321 
+0

Cảm ơn bạn đã đề xuất! Thật không may điều này không trả lời câu hỏi. Nếu một số phần tử là NaN, thì kết quả sẽ không phải là giá trị không phải NaN. Ví dụ, hãy xem xét df1.loc [0,0] = np.nan rồi df.where (df> df1, df1) sẽ là NaN cho phần tử ở vị trí [0,0] thay vì df. – DrTRD

+0

OK, tôi nghĩ rằng điều này sẽ làm việc 'df.where (df> df1, df1) .fillna (df)' – EdChum

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