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
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.
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)
Essaye ça .....
all_data = all_data.append(df)[df.columns.tolist()]
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.
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
À 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)