縦に結合する場合は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は以下になります。