# split

> For the complete documentation index, see [llms.txt](https://kotlin.github.io/dataframe/llms.txt).

This operation splits every value in the given columns into several values and optionally spreads them horizontally or vertically.

API reference: [split](https://kotlin.github.io/dataframe/api-docs/core/org.jetbrains.kotlinx.dataframe.api/split.html)

```TEXT
df.split { columns }
    [.cast<Type>()]
    [.by(delimiters|regex [,trim=true][,ignoreCase=true][,limit=0]) | .by { splitter } | .match(regex)] // how to split cell value
    [.default(value)] // how to fill nulls
    .into(columnNames) [ { columnNamesGenerator } ] | .inward(columnNames) [ { columnNamesGenerator } | .inplace() | .intoRows() | .intoColumns() ] // where to store results

splitter = DataRow.(T) -> Iterable<Any>
columnNamesGenerator = DataColumn.(columnIndex: Int) -> String
```

The following types of columns can be split easily:

* `String`: for instance, by `","`

* `List`: splits into elements, no `by` required!

* [DataFrame](dataframe.html): splits into rows, no `by` required!

Related operations: [Split / merge columns](splitmerge.html)

See [column selectors](columnselectors.html) for how to select the columns for this operation.

## Split in place

Stores split values as lists in their original columns.

Use the `.inplace()` terminal operation in your `split` configuration to spread split values in place:

Properties:

```KOTLIN
df.split { name.firstName }.by { it.asIterable() }.inplace()
```

Strings:

```KOTLIN
df.split { "name"["firstName"]<String>() }.by { it.asIterable() }.inplace()
```

[Embedded content](resources/org.jetbrains.kotlinx.dataframe.samples.api.Modify.splitInplace.html)

## Split horizontally

Stores split values in new columns.

* `into(col1, col2, ... )` — stores split values in new top-level columns

* `inward(col1, col2, ...)` — stores split values in new columns nested inside the original column

* `intoColumns` — splits [FrameColumns](datacolumn.html#framecolumn) into [ColumnGroups](datacolumn.html#columngroup) storing in every cell in a `List` of the original values per column

Reverse operation: [merge](merge.html)

`columnNamesGenerator` is used to generate names for additional columns when the list of explicitly specified `columnNames` is not long enough. `columnIndex` starts with `1` for the first additional column name.

The default `columnNamesGenerator` generates column names like `split1`, `split2`, etc.

Some examples:

Properties:

```KOTLIN
df.split { name.lastName }.by { it.asIterable() }.into("char1", "char2")
```

Strings:

```KOTLIN
df.split { "name"["lastName"]<String>() }.by { it.asIterable() }.into("char1", "char2")
```

[Embedded content](resources/org.jetbrains.kotlinx.dataframe.samples.api.Modify.split.html)

Properties:

```KOTLIN
df.split { name.lastName }
    .by { it.asIterable() }.default(' ')
    .inward { "char$it" }
```

Strings:

```KOTLIN
df.split { "name"["lastName"]<String>() }
    .by { it.asIterable() }.default(' ')
    .inward { "char$it" }
```

[Embedded content](resources/org.jetbrains.kotlinx.dataframe.samples.api.Modify.split1.html)

`String` columns can also be split into group matches of [Regex](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin.text/-regex/) patterns:

```KOTLIN
merged.split { "name"<String>() }
    .match("""(.*) \((.*)\)""")
    .inward("firstName", "lastName")
```

[Embedded content](resources/org.jetbrains.kotlinx.dataframe.samples.api.Modify.splitRegex1.html)

[FrameColumn](datacolumn.html#framecolumn) can be split into columns:

```KOTLIN
val df1 = dataFrameOf("a", "b", "c")(
    1, 2, 3,
    4, 5, 6,
)
val df2 = dataFrameOf("a", "b")(
    5, 6,
    7, 8,
    9, 10,
)
val df = dataFrameOf(
    "id" to columnOf("x", "y"),
    "group" to columnOf(df1, df2)
)

df.split { "group"<AnyFrame>() }.intoColumns()
```

## Split vertically

Stores split values in new rows, duplicating values in other columns.

Reverse operation: [implode](implode.html)

Use the `.intoRows()` terminal operation in your `split` configuration to spread split values vertically:

Properties:

```KOTLIN
df.split { name.firstName }.by { it.asIterable() }.intoRows()

df.split { name }.by { it.values() }.intoRows()
```

Strings:

```KOTLIN
df.split { "name"["firstName"]<String>() }.by { it.asIterable() }.intoRows()

df.split { colGroup("name") }.by { it.values() }.intoRows()
```

[Embedded content](resources/org.jetbrains.kotlinx.dataframe.samples.api.Modify.splitIntoRows.html)

Equivalent to `split { column }...inplace().explode { column }`. See [explode](explode.html) for details.

