4
votes

comment fusionner plusieurs fichiers csv à droite l'un de l'autre dans l'ordre temporel? (python)

J'ai actuellement téléchargé 120 fichiers (10 ans, mois par mois) de données csv.

J'utilise le code ci-dessous qui fusionne tous ces éléments dans un seul document qui va dans le temps, par exemple. g du 1/1/09 au 1/1/19.

Traceback (most recent call last):
  File "/Users/george/Desktop/collate/asdas.py", line 5, in <module>
    combine.columns = ['VICRRP', 'REGION1', 'SETTLEMENTDATE', 'QLD1RRP', 'REGION2']
  File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/pandas/core/generic.py", line 4389, in __setattr__
    return object.__setattr__(self, name, value)
  File "pandas/_libs/properties.pyx", line 69, in pandas._libs.properties.AxisProperty.__set__
  File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/pandas/core/generic.py", line 646, in _set_axis
    self._data.set_axis(axis, labels)
  File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/pandas/core/internals.py", line 3323, in set_axis
    'values have {new} elements'.format(old=old_len, new=new_len))
ValueError: Length mismatch: Expected axis has 9 elements, new values have 5 elements

Cela fonctionne très bien, mais sachez que j'ai également téléchargé le même type de données sauf pour un produit différent . Ce que je commande également toutes ces nouvelles données dans l'ordre du temps, mais je les ai côte à côte avec l'ancien ensemble de données.

Je reçois une erreur comme celle-ci:

Toute aide serait appréciée.

EDIT1:

import pandas as pd
df1 = pd.read_csv("product1.csv") 
df2 = pd.read_csv("product2.csv") 
combine = pd.merge(df1, df2, on='DATE', how='outer')
combine.columns = ['product1_price', 'REGION1', 'DATE', 'product2_price', 'REGION2']
combine[['DATE','product1_price','product2_price']]
combine.to_csv("combine.csv",index=False)

EDIT2:

Traceback (most recent call last):
  File "/Users/myname/Desktop/collate/asdas.py", line 4, in <module>
    result = pd.merge(data1[['REGION', 'TOTALDEMAND', 'RRP']], data2, on='SETTLEMENTDATE')
  File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/pandas/core/reshape/merge.py", line 61, in merge
    validate=validate)
  File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/pandas/core/reshape/merge.py", line 551, in __init__
    self.join_names) = self._get_merge_keys()
  File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/pandas/core/reshape/merge.py", line 871, in _get_merge_keys
    lk, stacklevel=stacklevel))
  File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/pandas/core/generic.py", line 1382, in _get_label_or_level_values
    raise KeyError(key)
KeyError: 'SETTLEMENTDATE'

Erreur:

from glob import glob
files = sorted(glob('*.csv'))
with open('cat.csv', 'w') as fi_out:
    for i, fname_in in enumerate(files):
        with open(fname_in, 'r') as fi_in:
                if i_line > 0 or i == 0:
                    fi_out.write(line)


0 commentaires

3 Réponses :


5
votes

Chargez vos données dans des dataframes

result = pd.merge(data1[['REGION', 'TOTALDEMA', 'RRP', 'SETTLEMENTDATE']], data2, on='SETTLEMENTDATE')

Fusionnez les deux dataframes sur SETTLEMENTDATE

result = pd.merge(data1, data2, on='SETTLEMENTDATE')

Cela suppose que il existe une relation 1 à 1 entre date de règlement dans les deux dataframes. S'il n'y en a pas, il y aura des doublons.

MODIFIER : Pour supprimer la colonne "PERIOD TYPE", faites

import pandas as pd
data1 = pd.read_csv("filename1.csv") 
data2 = pd.read_csv("filename2.csv") 


4 commentaires

Je vous remercie! Comment puis-je supprimer la colonne "PERIOD TYPE". Je pensais pouvoir le faire avant de fusionner le VIC avec QLD, mais pas vraiment sûr?


Aucun problème. N'oubliez pas de mettre la réponse comme acceptée si cela vous a été utile :)


Bien sûr, savez-vous qu'il faut supprimer la colonne TYPE DE PÉRIODE?


J'ai reçu des erreurs dans votre code modifié, vous deviez inclure SETTLEMENTDATE dans vos données1



1
votes

voir une autre option, vous pouvez utiliser externe quand il pourrait y avoir des dates non contenues dans les deux fichiers csv, donc garde toutes les dates sur les deux fichiers csv

maquette complète ci-dessous: p >

SETDATE VICRRP  QLD1RRP
0   01-06-2013  1.0 2.0
1   01-08-2013  8.0 NaN
2   01-08-2014  NaN 4.0

Résultats ci-dessous:

import pandas as pd 
df1 = pd.DataFrame({
    'SETDATE':['01-06-2013','01-08-2013'],
    'Region':['VIC1','VIC1'],
    'RRP':[1,8]})
df2 = pd.DataFrame({
    'SETDATE':['01-06-2013','01-08-2014'],
    'Region':['QLD1','QLD1'],
    'RRP':[2,4]})

combine = pd.merge(df1, df2, on='SETDATE', how='outer')
combine.columns = ['VICRRP', 'Reg1', 'SETDATE', 'QLD1RRP', 'Reg2']
combine[['SETDATE','VICRRP','QLD1RRP']]


2 commentaires

Quel est le problème avec mon code, en utilisant votre chemin? J'ai modifié ma question pour vous montrer


@newtoR, il semble que la fusion que vous avez effectuée a produit 9 colonnes. Mais lorsque vous avez renommé les colonnes, vous n'en avez spécifié que 5 ici. Et c'est pourquoi vous avez ce message d'erreur "ValueError: Discordance de longueur: l'axe attendu a 9 éléments, les nouvelles valeurs ont 5 éléments"



1
votes

tout le code ci-dessous si pour python3

python a un module de bibliothèque standard appelé csv

la bibliothèque est paresseuse par défaut,

signifiant que il ne lit les données que lorsque les données sont demandées dans le fichier,

donc il ne devrait pas consommer trop de RAM!

le code ressemblera à quelque chose comme ça, pardonnez-moi s'il y a des problèmes dans le code

import csv
vicfilename = 'filename1.csv'
qldfilename = 'filename2.csv'
mergedfilename = 'newfile.csv'

with open(mergedfilename, 'w', newline='') as mergedfile:
    fieldnames = ['SETTLEMENTDATE', 'VIC DEMAND', 'VIC RRP', 'QLD DEMAND', 'QLD RRP']
    writer = csv.DictWriter(mergedfile, fieldnames=fieldnames)
    writer.writeheader()
    with open(vicfilename, 'r', newline='') as vicfile:
        vicreader = csv.DictReader(vicfile)
        with open(qldfilename, 'r', newline='') as qldfile:
            qldreader = csv.DictReader(qldfile)

            for vicrow in vicreader:
                for qldrow in qldreader:
                    if vicrow['SETTLEMENTDATE'] == qldrow['SETTLEMENTDATE']:
                        writer.writerow({'SETTLEMENTDATE': vicrow['SETTLEMENTDATE'],
                                         'VIC DEMAND': vicrow['TOTALDEMAND'],
                                         'VIC RRP': vicrow['RRP'],
                                         'QLD DEMAND': qldrow['TOTALDEMAND'],
                                         'QLD RRP': qldrow['RRP'])
                        break
                qldfile.seek(0)
                qldreader = csv.DictReader(qldfile)

Les améliorations du code sont les bienvenues!


2 commentaires

Comment puis-je modifier cela pour python2?


essayez-le, cela pourrait fonctionner, car il n'y a pas de code spécifique à python2 ici.