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)
3 Réponses :
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")
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
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']]
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"
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!
Comment puis-je modifier cela pour python2?
essayez-le, cela pourrait fonctionner, car il n'y a pas de code spécifique à python2 ici.