withColumn(columnName, func = () => undefined) {
        return this.__newInstance__(
            this[__rows__].map((row, index) => {
                return row.set(columnName, func(row, index));
            }),
            this[__columns__].includes(columnName)
                ? this[__columns__]
                : [...this[__columns__], columnName]
        );
    }
Add a new column or set an existing one.
@param {String} columnName The column to modify or to create.
@param {Function} [func=(row, index) => undefined] The function to create the column.
@returns {DataFrame} A new DataFrame containing the new or modified column.
@example
df.withColumn('column4', () => 2)
df.withColumn('column2', (row) => row.get('column2') * 2)