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