22
20

More than 3 years have passed since last update.

pd.concat関数におけるsortのwarning

Last updated at Posted at 2020-01-24

縦に結合する場合はsortを入れてね、今はとりあえず列をsortしておくよ

結論からいうと異なるカラムを持つ、またはカラムの順序が異なるふたつのデータフレームを縦にpd.concatする場合はsort=Trueかsort=Falseをいれなければなりません。じゃないと以下のようなwarningが出ます。

pd.concat([df_1, df_2])

=============================================
FutureWarning: Sorting because non-concatenation axis is not aligned. A future version
of pandas will change to not sort by default.

To accept the future behavior, pass 'sort=False'.

To retain the current behavior and silence the warning, pass 'sort=True'.

  = pd.concat([df_1, df_2])

実際の例:カラムの順番のみが異なる場合

結局何が問題なの?って感じで最初はあまりイメージが湧かなかったのでここでシンプルな具体例を載せていきたいと思います。
二つのデータフレームdf_1とdf_2を用意します。

df_1 = pd.DataFrame({"b": ["kiwi", "avocado", "durian"],
                     "a": ["NY", "CA", "Seattle"]
                    })
df_2 = pd.DataFrame({"a": ["Tokyo", "Osaka", "Sapporo"],
                     "b": ["apple", "banana", "orange"]
                    })

df_1:

b a
0 kiwi NY
1 avocado CA
2 durian Seattle

df_2:

a b
0 Tokyo apple
1 Osaka banana
2 Sapporo orange

df_1はb、a列、df_2はa、b列という順になっています。

sort=Falseを引数にしてconcat

sort=Falseでまず通してみましょう。

concat_false = pd.concat([df_1, df_2], sort=False)

concat_false:

b a
0 kiwi NY
1 avocado CA
2 durian Seattle
0 apple Tokyo
1 banana Osaka
2 orange Sapporo

df_1と同じでb、a列と並んでいます。

sort=Trueでconcat (sort引数なしでconcatするのと同じ)

ここでsort=Trueにすると以下のようになります。

concated_true = pd.concat([df_1, df_2], sort=True)

concated_true:

a b
0 NY kiwi
1 CA avocado
2 Seattle durian
0 Tokyo apple
1 Osaka banana
2 Sapporo orange

この場合ですとa、b列の順になります。
sort引数を通さない場合は(今は)sort=Trueとみなして結合してくれます。そのかわりwarningが発生するわけです。


concated = pd.concat([df_1, df_2])
# equals関数を使ってconcatedとconcated_trueが同じか確認
print(concated.equals(concated_true))
# True
=============================================
/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/ipykernel_launcher.py:1: FutureWarning: Sorting because non-concatenation axis is not aligned. A future version
of pandas will change to not sort by default.

To accept the future behavior, pass 'sort=False'.

To retain the current behavior and silence the warning, pass 'sort=True'.

  """Entry point for launching an IPython kernel.

equals関数を使うことで、concated_true(sort=True)とconcated(sort引数なし)の二つのdfが等しいことがわかります。

実際の例:カラムが異なる時

カラムが異なってもだいたい同じです。

df_1 = pd.DataFrame({"a": ["Tokyo", "Osaka", "Sapporo"],
                     "b": ["apple", "banana", "orange"],
                     "c": [3, 2, 1],
                     "e": [2, 4, 8]})
df_2 = pd.DataFrame({"b": ["kiwi", "avocado", "durian"],
                     "c": [1, 3, 5],
                     "a": ["NY", "CA", "Seattle"],
                     "d": [2, 20, 1]})

df_1:

a b c e
0 Tokyo apple 3 2
1 Osaka banana 2 4
2 Sapporo orange 1 8

df_2:

b c a d
0 kiwi 1 NY 2
1 avocado 3 CA 20
2 durian 5 Seattle 1

共通している列はa、b、c列です。異なるのはd列とe列です。

sort=Falseを引数にconcat

concat_false = pd.concat([df_1, df_2], sort=False)
a b c e d
0 Tokyo apple 3 2.0 NaN
1 Osaka banana 2 4.0 NaN
2 Sapporo orange 1 8.0 NaN
0 NY kiwi 1 NaN 2.0
1 CA avocado 3 NaN 20.0
2 Seattle durian 5 NaN 1.0

列を見ると、a、b、c、e、dとアルファベット順になっていません。
df_1の列a、b、c、eにdf_2のd列を右からくっつけたものとなります。

sort引数なしでconcat (sort=Trueでconcatするのと同じ)

こちらのふたつのデータフレームをsortなしでconcatすると、以下のようになります。

concat = pd.concat([df_1, df_2])

=============================================
/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/ipykernel_launcher.py:1: FutureWarning: Sorting because non-concatenation axis is not aligned. A future version
of pandas will change to not sort by default.

To accept the future behavior, pass 'sort=False'.

To retain the current behavior and silence the warning, pass 'sort=True'.

  """Entry point for launching an IPython kernel.

concat:

a b c d e
0 Tokyo apple 3 NaN 2.0
1 Osaka banana 2 NaN 4.0
2 Sapporo orange 1 NaN 8.0
0 NY kiwi 1 2.0 NaN
1 CA avocado 3 20.0 NaN
2 Seattle durian 5 1.0 NaN

こちらはa、b、c、d、eとアルファベット順になっています。データの内容に関しては何も変わっていません。

これはsort=Trueをしたのと結果は同じになります。

concat_true = pd.concat([df_1, df_2], sort=True)
# concat_trueとconcatが一緒か確認
concat_true.equals(concat)
# True

# concat_trueとconcat_falseが一緒か確認
concat_false.equals(concat_true)
# False

concat_true:

a b c d e
0 Tokyo apple 3 NaN 2.0
1 Osaka banana 2 NaN 4.0
2 Sapporo orange 1 NaN 8.0
0 NY kiwi 1 2.0 NaN
1 CA avocado 3 20.0 NaN
2 Seattle durian 5 1.0 NaN

最後に:warningがうるさかったらとりあえずsort=Trueでいいんじゃない?

こちらのpandas concatのwarning、放置してても支障はきたしませんがもやもやしますよね。
データ自体には何も影響を及ぼさず、列の並び順のみが問題となるので見やすさのためにとりあえずsort=Trueでいいかもしれません。

参考にしたstackoverflowは以下になります。

https://stackoverflow.com/questions/50501787/python-pandas-user-warning-sorting-because-non-concatenation-axis-is-not-aligne

22
20
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
22
20