web-dev-qa-db-fra.com

Pourquoi l'ordre des colonnes change en ajoutant pandas dataframes?

Je veux ajouter (fusionner) tous les fichiers csv dans un dossier en utilisant Python pandas.

Par exemple: le dossier Say contient deux fichiers csv test1.csv et test2.csv comme suit:

A_Id    P_Id    CN1         CN2         CN3
AAA     111     702         709         740
BBB     222     1727        1734        1778

et

A_Id    P_Id    CN1         CN2         CN3
CCC     333     710        750          750
DDD     444     180        734          778

Donc, le script python que j'ai écrit était le suivant:

#!/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')

Bien que le combined.csv semble avoir toutes les lignes ajoutées, il ressemble à ceci:

      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

Où cela devrait ressembler à ceci:

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
  • Pourquoi les deux premières colonnes sont-elles déplacées à la fin?
  • Pourquoi est-il ajouté à la première ligne plutôt qu'à la dernière ligne?

Qu'est-ce que je rate? Et comment puis-je obtenir des 0 et des 1 dans la première colonne?

P.S: Comme ce sont de gros fichiers csv, j'ai pensé à utiliser des pandas.

27
kingmakerking

J'ai modifié le code comme ci-dessous. Commentaires en ligne.

#!/usr/bin/python
import pandas as pd
import glob

# Grab all the csv files in the folder to a list.
fileList = glob.glob('input_folder/*.csv')

#Initialize an empty dataframe to grab the csv content.
all_data = pd.DataFrame()

#Initialize an empty list to grab the dataframes.
dfList= []

for files in  fileList:
    df =  pd.read_csv(files, index_col = None, header= False)
    dfList.append(df)

#The frames will be in reverse order i.e last read file's content in the begining. So reverse it again
Reversed_dfList =  dfList[::-1]
CombinedFrame =  pd.concat(Reversed_dfList)

# The "Combined.csv" file will have combination of all the files.
CombinedFrame.to_csv('output_folder/Combined.csv', index=False)
1
kingmakerking

Essaye ça .....

all_data = all_data.append(df)[df.columns.tolist()]
16
user6745154

J'ai eu le même problème et c'était douloureux. J'ai réussi à le résoudre en réorganisant les colonnes en fonction de la trame de données source après l'avoir ajoutée à la trame de données finale. Cela ressemblerait à ceci:

#!/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 = all_data[df.columns]

all_data.to_csv('testfolder/combined.csv') 

Étant donné que votre problème remonte à près de deux ans, je publie une solution qui a fonctionné pour moi pour tout le monde qui sera également confronté à un problème similaire.

4
Uzzy

Vous pouvez utiliser réindexer pour passer à l'ordre d'origine:

all_data = all_data.append(df)
all_data = all_data.reindex(df.columns, axis=1)

J'ai vu cela ici (plus de détails dans le lien): https://github.com/pandas-dev/pandas/issues/4588#issuecomment-4442188

4
bubbassauro

À partir de la version 0.23.0, vous pouvez empêcher la méthode append() de trier le DataFrame ajouté final. Dans ton cas:

all_data = all_data.append(df, sort=False)
2
Shayan Amani