ENH: astype() can now take col label -> dtype mapping as arg; GH7271
New PR for what was started in #12086.

closes #7271

By passing a dict of {column name/column index: dtype}, multiple columns can be cast to different data types in a single command. Now users can do:

`df = df.astype({'my_bool', 'bool', 'my_int': 'int'})`

or:

`df = df.astype({0, 'bool', 1: 'int'})`

instead of:

```
df['my_bool'] = df.my_bool.astype('bool')
df['my_int'] = df.my_int.astype('int')
```

## [Current coverage](https://codecov.io/gh/pydata/pandas/pull/13375?src=pr) is **84.38%**

> Merging [#13375](https://codecov.io/gh/pydata/pandas/pull/13375?src=pr) into [master](https://codecov.io/gh/pydata/pandas/branch/master?src=pr) will increase coverage by **<.01%**

``` diff
@@             master     #13375   diff @@
==========================================
  Files           142        142          
  Lines         51223      51241    +18   
  Methods           0          0          
  Messages          0          0          
  Branches          0          0          
==========================================
+ Hits          43224      43242    +18   
  Misses         7999       7999          
  Partials          0          0          
```

> Powered by [Codecov](https://codecov.io?src=pr). Last updated by [ada6bf3...5fe82e3](https://codecov.io/gh/pydata/pandas/compare/ada6bf350f7fd4daaf2b80188ca165fb9543a252...5fe82e37ac1a895d770276ff090d11e633fa35aa?src=pr)
 Updated
 @StephenKappel Can you rebase this?

This will raise an error when you have duplicate columns (also if it is not the column you are astyping). But maybe we are OK with that?
 can you rebase / update
 rebased and updated to work with duplicate column names
 thanks! nice PR
