pandas 1.1.0 および1.0.0の主な追加機能

#この記事について
pandasは2020年7月28にバージョン1.0から1.1.0にアップデートされました。この記事で1.1.0の主な追加機能と、N番煎じではありますが、2020年1月の0.25.3から1.0.0へアップデートにおける主な追加機能についてまとめています。
2020年12月26日にバージョン1.2にアップデートされたので、追記をしました。

公式の情報は

https://pandas.pydata.org/pandas-docs/dev/whatsnew/v1.0.0.html

https://pandas.pydata.org/pandas-docs/dev/whatsnew/v1.1.0.html

https://pandas.pydata.org/pandas-docs/dev/whatsnew/v1.2.0.html

を参照ください。

# 検証環境
バージョン1.0は1.0.5、1.1は1.0.0、1.2は1.2.0で検証しています。0.25は0.25.1で検証しています。

# 1.0

## pd.NA
0.25まではmissing valueを表すのに、floatなら `np.nan`、object(文字列)ならば `np.nan` or `None`、時刻データならば `pd.NaT`、と様々な値が使われていた。

1.0でmissing valuesを表すのに`pd.NA`が導入された。

例えば、

```python
pd.Series([1, 2, None], dtype="Int64")
``` 
の3要素目はバージョン0.25では`np.nan`だったのが、1.0では`pd.NA`となる。

0.25まではmissing（np.nan）が存在する数値カラムは強制的にfloat64になってしまっていたが、1.0ではpd.NAが存在するInt8型のカラムというのも可能。

## string(StringDtype)型
stringデータのSeries（DataFrameのカラム)を表す型　string(StringDtype)型が追加された。文字列のSeries（or カラム）を扱うときはstring型の使用を推奨とのこと。

0.25まではstringデータを含むSeries（or カラム）を表すのはobject型だったため、

```python
pd.Series(['abc', True, 'def'], dtype="object")
``` 
(文字とbooleanの混合)が許されてしまう表現しかできなかったが、

1.0からは

```python
pd.Series(['abc', 'def'], dtype="string")
```
とすれば、そのSeries（or カラム）は文字列だけ許されることになる。

```python
pd.Series(['abc', True, 'def'], dtype="string")
```
はエラー。

```python
pd.Series(['abc', 'def', None], dtype="string")
```
の3要素目は`pd.NA`。

ただし

```python
pd.Series(['abc', True, 'def'])
```
(dtypeの指定なし)は従来通りobject型で、この表現も許容される。

## boolean(booleanDtype)型
booleanデータを表す型　boolean(booleanDtype)型が追加された。boolean(TrueまたはFalse)のSeries（or カラム）を扱うときはboolean型の使用を推奨。

```python
pd.Series([True, False, 0], dtype="booleal")
```
はエラー。（dtypeの指定が無しならば、エラーなく許容。`dtype="bool" ならば0はFalseに変換される）

missing valueの取扱については、

```python
pd.Series([True, False, np.nan])
pd.Series([True, False, None])
```
の3要素目はそれぞれnp.nan、Noneだが

```python
pd.Series([True, False, np.nan], dtype="boolean")
pd.Series([True, False, None], dtype="boolean")
```
とすると、3要素目はいずれもpd.NAとなる。

```python
pd.Series([True, False, np.nan], dtype="bool")
pd.Series([True, False, None], dtype="bool")
```
の場合は、3要素目はそれぞれTrue、Falseになる。

## convert_dtypes関数
```python
df = pd.DataFrame({'x': ['abc', None, 'def'],
                   'y': [1, 2, np.nan],
                   'z': [True, False, True]})
```
はx列：object、y列：float64、z列：bool となる。せっかくstring型、boolean型ができたのに...

そこで、

```python
df.convert_dtypes()
```
で、x列：string、y列：Int64、z列：boolean と変換される。Noneやnp.nanもこれでpd.NAとなる。

以上NAと型についての機能ははexperimentalな機能なため、変更の可能性があります。

# ignore_index 引数
`DataFrame.sort_values()` と `DataFrame.drop_duplicates()` にignore_index引数が追加された。ignore_index=Trueでソート後などのindexが0から順に振り直される。pandasのindexうざい派には朗報。

# 1.1

## dtype="string", astype("string")
```python
pd.Series([1, "abc", np.nan], dtype="string")
pd.Series([1, 2, np.nan], dtype="Int64").astype("string")
```
ですべての要素が文字列に。1.0までは要素がすべて文字列かnanじゃないとエラー。

## groupby
```python
df = pd.DataFrame([[1, 2, 3], [1, None, 4], [2, 1, 3], [1, 2, 2]], columns=["a", "b", "c"])

df.groupby(by=["b"], dropna=False).sum()
```
の結果が

```python
     a  c
b        
1.0  2  3
2.0  2  5
NaN  1  4
```
のようになり、byで指定したカラムの値がNAの行ついても集計される。Rのdplyrのgroup_byと同じような挙動。

`dropna=True`、もしくは指定なしの場合は、byで指定したカラムの値がNAの行は集計されない。

# 1.2
インデックスやカラム名の重複を許可しない属性の追加、to_csvにバイナリオブジェクトへの出力機能の追加などありますが、あまり使わなそうな内容が多いという印象です。
使いそうなのが、1.0で追加されたboolean型やstring形やInt64のFloat版の追加でした。ただし、Experimentalです。
```python
pd.Series([1, 2, None])
```
の3要素目は`np.nan`ですが、

```python
pd.Series([1, 2, None], dtype="Float64")
```
のとすると、3要素目は`pd.NA`となります。また、

```python
pd.Series([1, 2, "a"])
pd.Series([1, 2, "a"], dtype="Float64")
```
の前者はobject型となりますが、後者は許されません（エラー）。

比較演算に関して、

```python
pd.Series([1, 2, None]) > 1
```
の出力は

```python
0    False
1     True
2    False
dtype: bool
```
となりますが、

```python
pd.Series([1, 2, None], dtype="Float64") > 1
```
の出力は

```python
0    False
1     True
2     <NA>
dtype: boolean
```
となります。