web-dev-qa-db-fra.com

les pandas python fusionnent plusieurs fichiers csv

J’ai environ 600 jeux de données au format CSV, qui portent tous le même nom de colonne ["DateTime", "Réel", "Consensus", "Précédent", "Révisé"], tous les indicateurs économiques et les séries de données de tous les temps.

le but est de les fusionner tous dans un seul fichier csv.

Avec "DateTime" comme index.

Je voulais que ce fichier soit indexé dans l'ordre chronologique, ce qui veut dire, disons, le premier événement du premier csv daté du 18/12/2017 10:00:00 et le premier événement du deuxième csv du 12/29/2017 09:00:00 et premier événement du troisième CSV daté du 20/12/2017 09:00:00.

Donc, je veux les indexer plus tard en premier, et plus tard après, etc. malgré le csv source dont il est originaire.

J'ai essayé de fusionner seulement 3 d'entre eux à titre expérimental et le problème est le «DateTime», car il affiche les 3 ensemble comme ceci ('12/18/2017 10:00:00 ', '12/29/2017 09 : 00: 00 ', '12/20/2017 09:00:00') Voici le code:

import pandas as pd


df1 = pd.read_csv("E:\Business\Economic Indicators\Consumer Price Index - Core (YoY) - European Monetary Union.csv")
df2 = pd.read_csv("E:\Business\Economic Indicators\Private loans (YoY) - European Monetary Union.csv")
df3 = pd.read_csv("E:\Business\Economic Indicators\Current Account s.a - European Monetary Union.csv")

df = pd.concat([df1, df2, df3], axis=1, join='inner')
df.set_index('DateTime', inplace=True)

print(df.head())
df.to_csv('df.csv')
5
Sayed Gouda

Pensez à utiliser read_csv() args, index_col et parse_dates, pour créer des index lors de l'importation et les formater en tant que datetime. Ensuite, lancez votre fusion horizontale nécessaire. Ci-dessous suppose que la date est dans la première colonne de CSV. Et à la fin, utilisez sort_index() sur le bloc de données final pour trier les dates/heures.

df1 = pd.read_csv(r"E:\Business\Economic Indicators\Consumer Price Index - Core (YoY) - European Monetary Union.csv",
                  index_col=[0], parse_dates=[0])
df2 = pd.read_csv(r"E:\Business\Economic Indicators\Private loans (YoY) - European Monetary Union.csv",
                  index_col=[0], parse_dates=[0])
df3 = pd.read_csv(r"E:\Business\Economic Indicators\Current Account s.a - European Monetary Union.csv",
                  index_col=[0], parse_dates=[0])

finaldf = pd.concat([df1, df2, df3], axis=1, join='inner').sort_index()

Et pour l’approche DRY-er, en particulier sur les centaines de fichiers csv, utilisez une liste de compréhension.

import os
...
os.chdir('E:\\Business\\Economic Indicators')

dfs = [pd.read_csv(f, index_col=[0], parse_dates=[0])
        for f in os.listdir(os.getcwd()) if f.endswith('csv')]

finaldf = pd.concat(dfs, axis=1, join='inner').sort_index()
6
Parfait

Vous essayez de créer une grande base de données à partir des lignes de nombreuses bases de données qui portent toutes le même nom de colonne. axis devrait être 0 (valeur par défaut), pas 1. En outre, vous n'avez pas besoin de spécifier un type de jointure. Cela n'aura aucun effet puisque les noms de colonne sont les mêmes pour chaque image de données.

df = pd.concat([df1, df2, df3])

devrait être suffisant pour concaténer les jeux de données.

(voir https://pandas.pydata.org/pandas-docs/stable/merging.html )

Votre appel à set_index pour définir un index à l'aide des valeurs de la colonne DateTime devrait alors fonctionner.

2

Le problème est double: fusionner le fichier csv en un seul cadre de données, puis le classer par date.

Comme John Smith l'a souligné pour fusionner des images de données le long de lignes, vous devez utiliser:

df = pd.concat([df1,df2,df3])

Ensuite, vous souhaitez définir un index et réorganiser votre image de données en fonction de l'index. 

df.set_index('DateTime', inplace=True)
df.sort_index(inplace=True)

ou en ordre décroissant

df.sort_index(inplace=True,ascending=False)

(voir https://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.sort_index.html )


timeindex = pd.date_range('2018/01/01','2018/01/10')
randtimeindex = np.random.permutation(timeindex)
# Create three dataframes
df1 = pd.DataFrame(index=range(3),data=np.random.Rand(3,3),
                columns=['Actual','Consensus','DateTime'])
df1.DateTime=randtimeindex[:3]
df2 = pd.DataFrame(index=range(3),data=np.random.Rand(3,3),
                columns=['Actual','Consensus','DateTime'])
df2.DateTime=randtimeindex[3:6]
df3 = pd.DataFrame(index=range(4),data=np.random.Rand(4,3),
                columns=['Actual','Consensus','DateTime'])
df3.DateTime=randtimeindex[6:]

# Merge them
df4 = pd.concat([df1, df2, df3], axis=0)

# Reindex the merged dataframe, and sort it
df4.set_index('DateTime', inplace=True)
df4.sort_index(inplace=True, ascending=False)

print(df4.head())
0
bolirev