@@ -60,10 +60,14 @@ import org.jetbrains.kotlinx.dataframe.api.NullabilityException
6060import org.jetbrains.kotlinx.dataframe.api.NullabilityOptions
6161import org.jetbrains.kotlinx.dataframe.api.applyNullability
6262import org.jetbrains.kotlinx.dataframe.api.cast
63+ import org.jetbrains.kotlinx.dataframe.api.count
6364import org.jetbrains.kotlinx.dataframe.api.dataFrameOf
6465import org.jetbrains.kotlinx.dataframe.api.emptyDataFrame
6566import org.jetbrains.kotlinx.dataframe.api.getColumn
67+ import org.jetbrains.kotlinx.dataframe.api.getColumnsWithPaths
68+ import org.jetbrains.kotlinx.dataframe.api.isColumnGroup
6669import org.jetbrains.kotlinx.dataframe.api.toDataFrame
70+ import org.jetbrains.kotlinx.dataframe.api.toDataFrameFromPairs
6771import org.jetbrains.kotlinx.dataframe.impl.asList
6872import java.io.File
6973import java.math.BigDecimal
@@ -89,13 +93,16 @@ internal fun <T> Iterable<DataFrame<T>>.concatKeepingSchema(): DataFrame<T> {
8993 1 -> return dataFrames[0 ]
9094 }
9195
92- val columnNames = dataFrames.first().columnNames()
96+ val columnPaths = dataFrames.first()
97+ .getColumnsWithPaths { colsAtAnyDepth().filter { ! it.isColumnGroup() } }
98+ .map { it.path }
9399
94- val columns = columnNames.map { name ->
95- val values = dataFrames.flatMap { it.getColumn(name).values() }
96- DataColumn .createValueColumn(name, values, dataFrames.first().getColumn(name).type())
100+ val totalRows = dataFrames.sumOf { it.count() }
101+ val columns = columnPaths.map { path ->
102+ val values = dataFrames.flatMapTo(ArrayList (totalRows)) { it.getColumn(path).values() }
103+ path to DataColumn .createValueColumn(path.name(), values, dataFrames.first().getColumn(path).type())
97104 }
98- return dataFrameOf( columns).cast ()
105+ return columns.toDataFrameFromPairs ()
99106}
100107
101108private fun BitVector.values (range : IntRange ): List <Boolean ?> = range.map { getObject(it) }
0 commit comments