Support other dataframes like polars and pyarrow not just pandas

### Describe the workflow you want to enable

Currently, scikit-learn nowhere claims to support [pyarrow](https://arrow.apache.org/docs/python/) or [polars](https://www.pola.rs/). And indeed,
```python
import numpy as np
from sklearn.datasets import load_iris
from sklearn.preprocessing import StandardScaler, KBinsDiscretizer
from sklearn.compose import ColumnTransformer

X, y = load_iris(as_frame=True, return_X_y=True)
sepal_cols = ["sepal length (cm)", "sepal width (cm)"]
petal_cols = ["petal length (cm)", "petal width (cm)"]

preprocessor = ColumnTransformer(
    [
        ("scaler", StandardScaler(), sepal_cols),
        ("kbin", KBinsDiscretizer(encode="ordinal"), petal_cols),
    ],
    verbose_feature_names_out=False,
)

import polars as pl  # or import pyarrow as pa
X_pl = pl.from_pandas(X)  # or X_pa = pa.table(X)

preprocessor.fit_transform(X_pl)
# preprocessor.set_output(transform="pandas").fit_transform(X_pl)
```

errors with
```
AttributeError: 'numpy.ndarray' object has no attribute 'columns'

During handling of the above exception, another exception occurred:

ValueError: Specifying the columns using strings is only supported for pandas DataFrames
```

### Describe your proposed solution

scikit-learn should support those dataframes, maybe via the [python dataframe interchange protocol](https://data-apis.org/dataframe-protocol/latest/index.html).

In that regard, a new option like `set_output(transform="dataframe")` would be nice.

### Describe alternatives you've considered, if relevant

_No response_

### Additional context

Some related discussion came up in #25813.

COMMENT:
While scikit-learn does not currently support Polars or Pyarrow dataframes out-of-the-box, there are some possible workarounds to use these dataframes with scikit-learn.

One possible solution would be to convert the Polars or Pyarrow dataframe to a Pandas dataframe before passing it to scikit-learn's ```ColumnTransformer```. This can be done using the ```to_pandas()``` method in Polars or ```pa.Table.to_pandas()``` method in Pyarrow. 

```py
import polars as pl
from sklearn.preprocessing import StandardScaler
from sklearn.compose import ColumnTransformer

# Load data into a Polars dataframe
X_pl = pl.DataFrame({...})

# Convert Polars dataframe to Pandas dataframe
X_pd = X_pl.to_pandas()

# Create ColumnTransformer
preprocessor = ColumnTransformer(
    [
        ("scaler", StandardScaler(), ["sepal length (cm)", "sepal width (cm)"]),
    ]
)

# Fit and transform using ColumnTransformer
X_transformed = preprocessor.fit_transform(X_pd)
```

Another possible solution would be to write a custom transformer that can directly handle Polars or Pyarrow dataframes. This transformer would need to implement the ```fit_transform()``` method and should be compatible with scikit-learn's ```ColumnTransformer```.

```py
import polars as pl
from sklearn.base import BaseEstimator, TransformerMixin

class PolarsTransformer(BaseEstimator, TransformerMixin):
    def __init__(self, pl_transformer):
        self.pl_transformer = pl_transformer
    
    def fit(self, X, y=None):
        return self
    
    def transform(self, X, y=None):
        X_pl = pl.from_pandas(X)
        X_transformed_pl = self.pl_transformer.fit_transform(X_pl)
        X_transformed_pd = X_transformed_pl.to_pandas()
        return X_transformed_pd
```

With this custom transformer, you can pass it directly to scikit-learn's ```ColumnTransformer```:

```py
import polars as pl
from sklearn.preprocessing import StandardScaler
from sklearn.compose import ColumnTransformer

# Load data into a Polars dataframe
X_pl = pl.DataFrame({...})

# Create PolarsTransformer
preprocessor = ColumnTransformer(
    [
        ("scaler", PolarsTransformer(StandardScaler()), ["sepal length (cm)", "sepal width (cm)"]),
    ]
)

# Fit and transform using ColumnTransformer
X_transformed = preprocessor.fit_transform(X_pl)
```

Labels: New Feature, RFC