def combine_prescorer_scorer_results(
  modelResults: List[ModelResult],
) -> Tuple[pd.DataFrame, pd.DataFrame, c.PrescoringMetaOutput]:
  """
  Returns dfs with original columns plus an extra scorer name column.
  """
  assert isinstance(modelResults[0], ModelResult)

  prescoringNoteModelOutputList = []
  raterParamsUnfilteredMultiScorersList = []
  prescoringMetaOutput = c.PrescoringMetaOutput(metaScorerOutput={})

  for modelResult in modelResults:
    if modelResult.scoredNotes is not None:
      modelResult.scoredNotes[c.scorerNameKey] = modelResult.scorerName
      prescoringNoteModelOutputList.append(modelResult.scoredNotes)

    if modelResult.helpfulnessScores is not None:
      modelResult.helpfulnessScores[c.scorerNameKey] = modelResult.scorerName
      raterParamsUnfilteredMultiScorersList.append(modelResult.helpfulnessScores)

    if modelResult.metaScores is not None and modelResult.scorerName is not None:
      prescoringMetaOutput.metaScorerOutput[modelResult.scorerName] = modelResult.metaScores

  prescoringNoteModelOutput = pd.concat(
    prescoringNoteModelOutputList,
    unsafeAllowed={
      c.defaultIndexKey,
      c.noteIdKey,
      c.internalNoteInterceptKey,
      c.internalNoteFactor1Key,
      c.lowDiligenceNoteInterceptKey,
      c.lowDiligenceNoteFactor1Key,
    },
  )
  # BUG: The type error for this concat operation shows a mix of Int64 and float64 values in
  # some columns, suggesting that an input may be emtpy.  The type error is preceeded by this
  # warning from Pandas, which also points to an empty input:
  #   FutureWarning: The behavior of DataFrame concatenation with empty or all-NA entries is
  #   deprecated. In a future version, this will no longer exclude empty or all-NA columns
  #   when determining the result dtypes. To retain the old behavior, exclude the relevant
  #   entries before the concat operation.
  # All columns below except incorrectTagRatingsMadeByRater and raterParticipantId show a mix
  # of float64/float32 and object.  incorrectTagRatingsMadeByRater mixes Int64/Int8 and object,
  # and raterParticipantId mixes Int64 and object.
  raterParamsUnfilteredMultiScorers = pd.concat(
    raterParamsUnfilteredMultiScorersList,
    unsafeAllowed={
      c.defaultIndexKey,
      c.internalRaterInterceptKey,
      c.internalRaterFactor1Key,
      c.crhCrnhRatioDifferenceKey,
      c.meanNoteScoreKey,
      c.raterAgreeRatioKey,
      c.aboveHelpfulnessThresholdKey,
      c.internalRaterReputationKey,
      c.lowDiligenceRaterInterceptKey,
      c.lowDiligenceRaterFactor1Key,
      c.lowDiligenceRaterReputationKey,
      c.incorrectTagRatingsMadeByRaterKey,
      c.raterParticipantIdKey,
    },
  )
  return (
    prescoringNoteModelOutput[c.prescoringNoteModelOutputTSVColumns],
    raterParamsUnfilteredMultiScorers[c.prescoringRaterModelOutputTSVColumns],
    prescoringMetaOutput,
  )

  Returns dfs with original columns plus an extra scorer name column.
  
sourcecode/scoring/run_scoring.py