Wenn Sie zwei Datenrahmen mit unterschiedlichen Spalten oder unterschiedlicher Spaltenreihenfolge vertikal pd.concat möchten, müssen Sie abschließend sort = True oder sort = False eingeben. Andernfalls wird die folgende Warnung ausgegeben.
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])
Was ist denn los? Anfangs habe ich nicht viele Bilder bekommen, deshalb möchte ich hier ein einfaches konkretes Beispiel geben. Bereiten Sie zwei Datenrahmen vor, df_1 und 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 liegt in der Reihenfolge von b und a und df_2 in der Reihenfolge von a und b.
Lassen Sie es uns zuerst mit sort = False übergeben.
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 |
Gleich wie df_1, ausgerichtet mit den Spalten b und a.
Wenn hier sort = True gesetzt ist, ist dies wie folgt.
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 |
In diesem Fall ist die Reihenfolge die Spalten a und b. Wenn Sie das Sortierargument nicht übergeben, wird (vorerst) sort = True angenommen und kombiniert. Stattdessen wird eine Warnung angezeigt.
concated = pd.concat([df_1, df_2])
#Mit der Funktion equals verkettet und verkettet_Überprüfen Sie, ob true gleich ist
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.
Mit der Funktion equals können wir feststellen, dass die beiden dfs concated_true (sort = True) und concated (ohne das sort-Argument) gleich sind.
Es ist fast gleich, auch wenn die Spalten unterschiedlich sind.
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 |
Die gemeinsamen Spalten sind die Spalten a, b und c. Der Unterschied ist Spalte d und Spalte 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 |
Wenn Sie die Spalten betrachten, sind sie nicht in alphabetischer Reihenfolge: a, b, c, e, d. Die Spalten a, b, c und e von df_1 sind von rechts an die d-Spalte von df_2 angehängt.
Wenn Sie diese beiden Datenrahmen ohne Sortierung verknüpfen, erhalten Sie Folgendes.
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 |
Dies ist in alphabetischer Reihenfolge als a, b, c, d, e. An den Inhalten der Daten hat sich nichts geändert.
Dies hat das gleiche Ergebnis wie sort = True.
concat_true = pd.concat([df_1, df_2], sort=True)
# concat_Überprüfen Sie, ob true und concat identisch sind
concat_true.equals(concat)
# True
# concat_wahr und konkat_Überprüfen Sie, ob false gleich ist
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 |
Diese Pandas Concat-Warnung tut nicht weh, wenn sie unbeaufsichtigt bleibt, aber sie trübt. Sort = True kann aus Gründen der Lesbarkeit ausreichend sein, da es keine Auswirkungen auf die Daten selbst hat und nur die Reihenfolge der Spalten von Bedeutung ist.
Der Stapelüberlauf, auf den ich mich bezog, ist wie folgt.
https://stackoverflow.com/questions/50501787/python-pandas-user-warning-sorting-because-non-concatenation-axis-is-not-aligne
Recommended Posts