Enable feature selectors to pass pandas DataFrame to estimator

### Describe the workflow you want to enable

When running SequentialFeatureSelector (or, presumably, other feature selection methods) with a pandas DataFrame input, the reduced-feature input is passed to the estimator as a numpy array. This seems inconsistent with the other transformers that successfully maintain the pandas indices.

My actual use case is the following: Select the best k features that complement a set of fixed features. I was going to implement it like this: (happy to take suggestions for alternatives).

```python
import pandas as pd
import numpy as np
import sklearn
from sklearn.feature_selection import SequentialFeatureSelector
from sklearn.compose import ColumnTransformer
from sklearn.preprocessing import FunctionTransformer
from sklearn.linear_model import LinearRegression
from sklearn.pipeline import Pipeline

X=pd.DataFrame(np.random.rand(10,3))
y=pd.Series(np.random.rand(10))

fixed_features=pd.DataFrame(np.random.rand(X.shape[0],2))
appender= FunctionTransformer(lambda X:pd.concat([X,fixed_features.reindex(X.index)],axis=1))
X.shape,appender.fit_transform(X).shape
```

    ((10, 3), (10, 5))


```python
LR_with_fixed=LR=Pipeline(steps=[
    ('append',appender),
    ('LR',LinearRegression())
])
SFS_with_fixed = SequentialFeatureSelector(
    LR_with_fixed,n_features_to_select=1, direction="forward"
)
_=SFS_with_fixed.fit(X,y)
```

    ValueError: 
    All the 5 fits failed.
    .....
      File "/tmp/ipykernel_275/897617596.py", line 2, in <lambda>
        appender= FunctionTransformer(lambda X:pd.concat([X,fixed_features.reindex(X.index)],axis=1))
    AttributeError: 'numpy.ndarray' object has no attribute 'index'



### Describe your proposed solution

I believe that it should be possible to pass the reduced matrix to the estimator as a pandas DataFrame, and this would be consistent with the way other Transformers work currently.

### Describe alternatives you've considered, if relevant

An alternative that would suffice for my particular use case is to directly pass a set of fixed features as a parameter to the feature selector.

### Additional context

_No response_

COMMENT:
Maybe I'm not following, but I was trying to say that `SequentialFeatureSelector` doesn't pass all the input to the estimator.

```
N=10
X=pd.DataFrame(np.random.rand(N,3),columns=[*'abc'])
y=pd.Series(np.random.rand(N))

class LRwrapper(LinearRegression):
    def fit(self,X,y,*args,**kw):
        print(f'Input is {type(X)} with shape {X.shape}')
        super().fit(X,y,*args,**kw)
        
LR=LRwrapper()
LR.fit(X,y)
```

> 
>Input is <class 'pandas.core.frame.DataFrame'> with shape (10, 3)
>

```
SFS = SequentialFeatureSelector(
    LR,n_features_to_select=1, direction="forward",cv=2
)
SFS.fit(X,y)
```

> Input is <class 'numpy.ndarray'> with shape (5, 1)
> Input is <class 'numpy.ndarray'> with shape (5, 1)
> Input is <class 'numpy.ndarray'> with shape (5, 1)
> Input is <class 'numpy.ndarray'> with shape (5, 1)
> Input is <class 'numpy.ndarray'> with shape (5, 1)
> Input is <class 'numpy.ndarray'> with shape (5, 1)

I don't see why this shouldn't be a (5,1) pandas DataFrame instead, with feature names and indices.

For my own use case I made a version of `SequentialFeatureSelector` that does what I need, but still think this is a good idea in general.

Labels: Bug