code: def _get_false_columns(df: DataFrame):
      block_table = df.block_table
      data_manager = df.data_manager
      block_index_set = set(data_manager.infer_operable_blocks())
  
      false_table = block_table.mapValues(
          lambda blocks: [
              block.all(axis=0) if bid in block_index_set else []
              for bid, block in enumerate(blocks)
          ]
      )
  
      false_values = false_table.reduce(
          lambda blocks1, blocks2: [
              block1 & block2 if bid in block_index_set else []
              for bid, (block1, block2) in enumerate(
                  zip(blocks1, blocks2)
              )
          ]
      )
  
      false_columns = set()
      column_names = data_manager.infer_operable_field_names()
      for name in column_names:
          _bid, _offset = data_manager.loc_block(name)
          if isinstance(false_values[_bid], torch.Tensor):
              if not false_values[_bid][_offset].item():
                  false_columns.add(name)
          elif isinstance(false_values[_bid], np.ndarray):
              if not false_values[_bid][_offset]:
                  false_columns.add(name)
  
      return false_columns
  
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 2 for calling a global function with example usage: _get_false_columns(df) and returns: false_columns