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ügen print 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 zu all_data.to_csv('out/combined.csv')
  • Sie können sich 0 und 1 durch hinzufügen von parameter index=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.

Schreibe einen Kommentar