Warum die Reihenfolge der Spalten verändert sich beim Anhängen pandas dataframes?
Möchte ich anfügen (merge) alle csv-Dateien in einem Ordner mit Python pandas.
Beispiel: Sagen-Ordner hat zwei csv-Dateien test1.csv
und test2.csv
wie folgt:
A_Id P_Id CN1 CN2 CN3
AAA 111 702 709 740
BBB 222 1727 1734 1778
und
A_Id P_Id CN1 CN2 CN3
CCC 333 710 750 750
DDD 444 180 734 778
Also das python-Skript, das ich schrieb, war wie folgt:
#!/usr/bin/python
import pandas as pd
import glob
all_data = pd.DataFrame()
for f in glob.glob("testfolder/*.csv"):
df = pd.read_csv(f)
all_data = all_data.append(df)
all_data.to_csv('testfolder/combined.csv')
Obwohl die combined.csv
scheint haben alle die Zeilen angehängt, es sieht wie folgt aus:
CN1 CN2 CN3 A_Id P_Id
0 710 750 750 CCC 333
1 180 734 778 DDD 444
0 702 709 740 AAA 111
1 1727 1734 1778 BBB 222
Wo, wie es sollte wie folgt Aussehen:
A_ID P_Id CN1 CN2 CN2
AAA 111 702 709 740
BBB 222 1727 1734 1778
CCC 333 110 356 123
DDD 444 220 256 223
- Warum sind die ersten zwei Spalten verschoben, um das Ende?
- Warum ist es Anhängen in der ersten Zeile anstatt auf der letzten Zeile?
Was bin ich? Und wie kann ich die bekommen von 0s und 1s in der ersten Spalte?
P. S: Da diese großen csv-Dateien, ich dachte, der Verwendung von pandas.
- Welche version von pandas verwenden? Weil es funktioniert in 0.17.0 gut.
- Ich denke, dass problem mit dem format der csv - versuchen nach Zeile
df = pd.read_csv(f)
hinzufügenprint df.head()
für die Prüfung. - Und ich denke, Sie Lesen die Ausgabe als Eingabe
glob.glob("testfolder/*.csv"):
, da die Ausgabe schreiben-Eingabe-Verzeichnis:all_data.to_csv('testfolder/combined.csv')
sind, ändern Sie Verzeichnis zuall_data.to_csv('out/combined.csv')
- Sie können sich
0
und1
durch hinzufügen von parameterindex=False
all_data.to_csv('out/combined.csv', index=False)
- So Sortieren Sie die Input-files auf Datei-name:
for f in sorted(glob.glob("testfolder/*.csv")):
.Lesen test1.csv-vor test2.csv, und stellen Sie sicher, dass die Zeilen in der richtigen Reihenfolge... - In der Realität werden die Dateinamen Zufallszahlen 🙁
- Die Spalten können sortiert werden, bevor Sie das schreiben zu csv:
all_data = all_data[['A_Id','P_Id','CN1','CN2','CN3']]
- Oh, ich wusste gar nicht daran zu denken. Allerdings habe ich einige änderungen und es wird beantwortet, indem ich mich unten.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Versuchen, diese .....
all_data
hatte mehr Spalten alsdf
wird dies weglassen der Spalten, die nicht vorhanden sind, sind indf
.Ich hatte das gleiche Problem und es war schmerzhaft. Ich konnte es lösen durch eine Neugestaltung der Spalten basierend auf der Quell-dataframe, nachdem es Hinzugefügt wurde Letzte dataframe. Es würde dann so Aussehen:
Da deine Frage wurde von fast zwei Jahren, bin ich Entsendung Lösung, die für mich gearbeitet für enyone anderen, die mit ähnlichen Problem.
Können Sie reindex zu ändern, um die ursprüngliche Reihenfolge:
Sah ich das hier (weitere details im link): https://github.com/pandas-dev/pandas/issues/4588#issuecomment-44421883
Ich optimiert den code, wie unten beschrieben. Kommentare-line.
Ab version 0.23.0, können Sie verhindern, dass die
append()
Methode zum Sortieren der Letzte DataFrame angehängt. In deinem Fall:df = pd.concat([df1, df2], sort=False)