df_filter Function

public function df_filter(df, mask) result(filtered_df)

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

Arguments

Type IntentOptional Attributes Name
type(data_frame), intent(in) :: df
type(boolean_mask), intent(in) :: mask

Return Value type(data_frame)


Source Code

    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