code: def _where_float_type(
      l_block_table,
      r_block_table,
      l_data_manager: "DataManager",
      r_data_manager: "DataManager",
      column_names: List[str],
  ):
      l_loc_info = [
          l_data_manager.loc_block(name) for name in column_names
      ]
      r_loc_info = [
          r_data_manager.loc_block(name) for name in column_names
      ]
  
      def __convert_na(l_blocks, r_blocks):
          ret_blocks = []
          for block in l_blocks:
              if isinstance(block, torch.Tensor):
                  ret_blocks.append(block.clone())
              elif isinstance(block, np.ndarray):
                  ret_blocks.append(np.copy(block))
              else:
                  ret_blocks.append(block)
  
          for (l_bid, l_offset), (r_bid, r_offset) in zip(
              l_loc_info, r_loc_info
          ):
              if isinstance(ret_blocks[l_bid], torch.Tensor):
                  ret_blocks[l_bid][:, l_offset][
                      ~r_blocks[r_bid][:, r_offset]
                  ] = torch.nan
              else:
                  ret_blocks[l_bid][:, l_offset][
                      ~r_blocks[r_bid][:, r_offset]
                  ] = np.nan
  
          return ret_blocks
  
      return l_block_table.join(r_block_table, __convert_na)
  
file_path: FATE/python/fate/arch/dataframe/ops/_where.py
imports: import numpy
  import torch
  from typing import List
  from .._dataframe import DataFrame
  from ..manager import BlockType
  from ..manager import DataManager
label_desc: Use image node_id 3 for calling a global function with example usage: _where_float_type(l_block_table, r_block_table, l_data_manager, r_data_manager, column_names) and returns: l_block_table, ret_blocks