#この記事について
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にアップデートされたので、追記をしました。
公式の情報は
を参照ください。
検証環境
バージョン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
が導入された。
例えば、
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型だったため、
pd.Series(['abc', True, 'def'], dtype="object")
(文字とbooleanの混合)が許されてしまう表現しかできなかったが、
1.0からは
pd.Series(['abc', 'def'], dtype="string")
とすれば、そのSeries(or カラム)は文字列だけ許されることになる。
pd.Series(['abc', True, 'def'], dtype="string")
はエラー。
pd.Series(['abc', 'def', None], dtype="string")
の3要素目はpd.NA
。
ただし
pd.Series(['abc', True, 'def'])
(dtypeの指定なし)は従来通りobject型で、この表現も許容される。
boolean(booleanDtype)型
booleanデータを表す型 boolean(booleanDtype)型が追加された。boolean(TrueまたはFalse)のSeries(or カラム)を扱うときはboolean型の使用を推奨。
pd.Series([True, False, 0], dtype="booleal")
はエラー。(dtypeの指定が無しならば、エラーなく許容。`dtype="bool" ならば0はFalseに変換される)
missing valueの取扱については、
pd.Series([True, False, np.nan])
pd.Series([True, False, None])
の3要素目はそれぞれnp.nan、Noneだが
pd.Series([True, False, np.nan], dtype="boolean")
pd.Series([True, False, None], dtype="boolean")
とすると、3要素目はいずれもpd.NAとなる。
pd.Series([True, False, np.nan], dtype="bool")
pd.Series([True, False, None], dtype="bool")
の場合は、3要素目はそれぞれTrue、Falseになる。
convert_dtypes関数
df = pd.DataFrame({'x': ['abc', None, 'def'],
'y': [1, 2, np.nan],
'z': [True, False, True]})
はx列:object、y列:float64、z列:bool となる。せっかくstring型、boolean型ができたのに...
そこで、
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")
pd.Series([1, "abc", np.nan], dtype="string")
pd.Series([1, 2, np.nan], dtype="Int64").astype("string")
ですべての要素が文字列に。1.0までは要素がすべて文字列かnanじゃないとエラー。
groupby
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()
の結果が
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です。
pd.Series([1, 2, None])
の3要素目はnp.nan
ですが、
pd.Series([1, 2, None], dtype="Float64")
のとすると、3要素目はpd.NA
となります。また、
pd.Series([1, 2, "a"])
pd.Series([1, 2, "a"], dtype="Float64")
の前者はobject型となりますが、後者は許されません(エラー)。
比較演算に関して、
pd.Series([1, 2, None]) > 1
の出力は
0 False
1 True
2 False
dtype: bool
となりますが、
pd.Series([1, 2, None], dtype="Float64") > 1
の出力は
0 False
1 True
2 <NA>
dtype: boolean
となります。