ENH: .pipe to subset of columns
#### Feature Request

I often find myself writing code like the following to create a pipeline:

```python
# specific function
def astype_int(df, cols):
    """Convert columns to integer."""
    df = df.copy()
    df[cols] = df[cols].astype('int')
    return df

# more general
def myfun(df, cols):
    """Custom transformation function."""
    df = df.copy()

    def my_transform(col):
        """Do something."""
        return 100 * col
        
    df[cols] = df[cols].apply(my_transform)
    return df
    
# the pipeline
df = (pd.read_csv(my_csv)
             .rename(columns=column_names)
             .pipe(astype_int, cols=['a', 'b'])
             .pipe(myfun, cols=['c', 'd', 'e'])
         )
```

where I end up applying a function to a subset of columns. It is cumbersome to write an additional function that ends up in the pipeline, or to write separate lines outside of the pipeline such as:

```python
df[cols] = df[cols].apply(my_transform)
```

It would be much more convenient if `df.pipe` accepted a `columns` keyword argument that effectively does behind the scenes what we currently have to write explicitly. Other functions, such as `astype` would need to support this capability as well. The above code would then become:

```python
def my_transform(col):
    """Do something."""
    return 100 * col

# the pipeline
df = (pd.read_csv(my_file)
             .rename(columns=column_names)
             .astype('int', columns=['a', 'b'])
             .pipe(my_transform, columns=['c', 'd', 'e'])
         )
```

which is much cleaner. I have started digging into the source code myself, but figured I would put this request out there in case there are any fundamental issues or someone beats me to it.
