En conclusion, si vous souhaitez pd.concat verticalement deux blocs de données avec des colonnes différentes ou un ordre de colonne différent, vous devez entrer sort = True ou sort = False. Sinon, l'avertissement suivant sera émis.
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])
Qu'est-ce qui ne va pas après tout? Au début, je n'ai pas eu beaucoup d'images, alors j'aimerais donner un exemple concret simple ici. Préparez deux trames de données, df_1 et 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 est de l'ordre de b et a, et df_2 est de l'ordre de a et b.
Passons-le d'abord avec 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 |
Identique à df_1, aligné avec les colonnes b et a.
Si sort = True est défini ici, ce sera comme suit.
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 |
Dans ce cas, l'ordre est les colonnes a et b. Si vous ne passez pas l'argument de tri, il supposera (pour l'instant) sort = True et se combinera. Au lieu de cela, un avertissement se produira.
concated = pd.concat([df_1, df_2])
#Concated et concated en utilisant la fonction égal_Vérifiez si vrai est le même
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.
En utilisant la fonction equals, nous pouvons voir que les deux dfs, concated_true (sort = True) et concated (sans l'argument sort), sont égaux.
C'est presque la même chose même si les colonnes sont différentes.
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 |
Les colonnes communes sont les colonnes a, b et c. La différence est la colonne d et la colonne e.
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 |
En regardant les colonnes, elles ne sont pas classées par ordre alphabétique: a, b, c, e, d. C'est la colonne a, b, c, e de df_1 avec la colonne d de df_2 attachée par la droite.
Si vous concattez ces deux blocs de données sans tri, vous obtiendrez ce qui suit.
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 |
C'est dans l'ordre alphabétique comme a, b, c, d, e. Rien n'a changé concernant le contenu des données.
Cela a le même résultat que de faire sort = True.
concat_true = pd.concat([df_1, df_2], sort=True)
# concat_Vérifiez si true et concat sont identiques
concat_true.equals(concat)
# True
# concat_vrai et concat_Vérifiez si faux est le même
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 |
Cet avertissement de pandas concat ne fait pas de mal s'il est laissé sans surveillance, mais il brume. Sort = True peut être suffisant pour des raisons de lisibilité, car il n'a aucun effet sur les données elles-mêmes et seul l'ordre des colonnes compte.
Le débordement de la pile de référence est le suivant.
https://stackoverflow.com/questions/50501787/python-pandas-user-warning-sorting-because-non-concatenation-axis-is-not-aligne
Recommended Posts