Filter data frame using a boolean mask (pandas-like df[mask] operation)
@param[in] df The data frame to filter @param[in] mask The boolean mask to apply @return filtered_df New data frame with only rows where mask is true
| Type | Intent | Optional | Attributes | Name | ||
|---|---|---|---|---|---|---|
| type(data_frame), | intent(in) | :: | df | |||
| type(boolean_mask), | intent(in) | :: | mask |
function df_filter(df, mask) result(filtered_df) type(data_frame), intent(in) :: df type(boolean_mask), intent(in) :: mask type(data_frame) :: filtered_df logical, dimension(:), allocatable :: mask_array integer, dimension(:), allocatable :: selected_rows integer :: i, count_true, idx if (mask % get_size() /= df % nrows()) then error stop "mask size must match number of rows in dataframe" end if mask_array = mask % get_mask() count_true = count(mask_array) ! Handle empty result if (count_true == 0) then call filtered_df % new(df % get_max_char_len()) deallocate (mask_array) return end if ! Get indices of true values allocate (selected_rows(count_true)) idx = 1 do i = 1, size(mask_array) if (mask_array(i)) then selected_rows(idx) = i idx = idx + 1 end if end do call filtered_df % new(df % get_max_char_len()) ! Copy selected rows for each column do i = 1, df % ncols() call copy_filtered_column(df, filtered_df, i, selected_rows) end do deallocate (mask_array, selected_rows) end function df_filter