class_docstr: Sub class of DataContainer to zip two data sources together.
  
  .. seealso::
      :class: `DataContainer`
class_docstr_tok: ["Sub","class","of","DataContainer","to","zip","two","data","sources","together",".","..","seealso",":",":",":","class",":","`","DataContainer","`"]
docstr: Merges two data sources together. Zips only the data input part and keeps the expected output of the first DataContainer as is.
  NOTE: Expects that all DataContainer are at least as long as data_container.
  
  :param data_container: the main data container, the attribute of this data container will be kept by the returned ZipDataContainer.
  :type data_container: DataContainer
  :param other_data_containers: other data containers to zip with data container
  :type other_data_containers: List[DataContainer]
  :param zip_expected_outputs: Determines wether we kept the expected_output of data_container or we zip the expected_outputs of all DataContainer provided
  :return: expanded data container
  :rtype: ExpandedDataContainer
docstr_tok: ["Merges","two","data","sources","together",".","Zips","only","the","data","input","part","and","keeps","the","expected","output","of","the","first","DataContainer","as","is",".","NOTE",":","Expects","that","all","DataContainer","are","at","least","as","long","as","data_container",".",":","param","data_container",":","the","main","data","container",",","the","attribute","of","this","data","container","will","be","kept","by","the","returned","ZipDataContainer",".",":","type","data_container",":","DataContainer",":","param","other_data_containers",":","other","data","containers","to","zip","with","data","container",":","type","other_data_containers",":","List","[","DataContainer","]",":","param","zip_expected_outputs",":","Determines","wether","we","kept","the","expected_output","of","data_container","or","we","zip","the","expected_outputs","of","all","DataContainer","provided",":","return",":","expanded","data","container",":","rtype",":","ExpandedDataContainer"]
code: def create_from(
      data_container: DACT,
      *other_data_containers: List[DACT],
      zip_expected_outputs: bool = False,
  ) -> "ZipDataContainer":
      """
      Merges two data sources together. Zips only the data input part and keeps the expected output of the first DataContainer as is.
      NOTE: Expects that all DataContainer are at least as long as data_container.
  
      :param data_container: the main data container, the attribute of this data container will be kept by the returned ZipDataContainer.
      :type data_container: DataContainer
      :param other_data_containers: other data containers to zip with data container
      :type other_data_containers: List[DataContainer]
      :param zip_expected_outputs: Determines wether we kept the expected_output of data_container or we zip the expected_outputs of all DataContainer provided
      :return: expanded data container
      :rtype: ExpandedDataContainer
      """
  
      new_data_inputs = tuple(
          zip(
              *map(
                  attrgetter("di"),
                  [data_container] + list(other_data_containers),
              )
          )
      )
      if zip_expected_outputs:
          expected_outputs = tuple(
              zip(
                  *map(
                      attrgetter("eo"),
                      [data_container] + list(other_data_containers),
                  )
              )
          )
      else:
          expected_outputs = data_container.expected_outputs
  
      return ZipDataContainer(
          data_inputs=new_data_inputs,
          expected_outputs=expected_outputs,
          ids=data_container._ids,
          sub_data_containers=data_container.sub_data_containers,
      )
  
imports: import copy
  import math
  from operator import attrgetter
  from typing import Any, Callable, Generic, Iterable, Iterator, List, Optional, Tuple, TypeVar, Union
  import numpy
  import pandas
label_desc: Use image node_id 1 for calling the ZipDataContainer obj's underlying member method code with example usage: obj.create_from(data_container) and returns: ZipDataContainer