Si j'ai 2 fichiers csv comme suit:
csv1.csv:
import pandas as pd data = pd.read_csv(r'data.csv') creo = pd.read_csv(r'creo.csv') adset = pd.read_csv(r'adset.csv') campaign = pd.read_csv(r'campaign.csv') CreoDict = pd.Series(creo.iloc[:,1].values,index=creo.iloc[:,0]).to_dict() AdsetDict = pd.Series(adset.iloc[:,1].values,index=adset.iloc[:,0]).to_dict() CampaignDict = pd.Series(adset.iloc[:,1].values,index=adset.iloc[:,0]).to_dict() data.iloc[:,8] = data.iloc[:,8].replace(CreoDict) data.iloc[:,6] = data.iloc[:,6].replace(AdsetDict) data.iloc[:,4] = data.iloc[:,4].replace(CampaignDict) data.to_csv(r'total.csv')
csv2.csv:
import csv
table1 = r'data.csv'
table2 = r'facebook_creo.csv'
creo_desc = dict()
with open(table2) as tbl2:
t2 = csv.reader(tbl2, delimiter=',')
next(t2)
for t2row in t2:
wrong_creo = t2row[0]
desc = t2row[1]
creo_desc[wrong_creo] = desc
with open(table1) as tbl1:
t1 = csv.reader(tbl1, delimiter=',')
for t1row in t1:
wrong_creo = t1row[8]
t1.writerow(t1row[8])
Je recherche un moyen Python pour remplacer les mauvaises valeurs de csv1 (la troisième colonne de csv1 est égale à la première colonne de csv2)) par les bonnes valeurs de csv2 (la deuxième colonne).
Cela devrait ressembler à:
1,Bob,Bob@gmail.com,b1 2,Tom,Tom@gmail.com,f1 3,Bill,Bill@gmail.com,softball
Mon code ne fonctionne pas.
baseball, b1 football, f1 ...
Version Pandas:
XXX
3 Réponses :
baseball, b1 football, f1
Il aurait été préférable de joindre le message d'erreur, cependant, je suppose que vous devriez utiliser csv.writer là où vous souhaitez apporter des modifications plutôt que csv.reader code> ..
J'utiliserais des pandas pour lire les 2 tableaux, en utilisant le deuxième tableau pour être un dictionnaire des valeurs de remplacement à remapper en csv1.
print (csv1) 0 1 2 3 0 1 Bob Bob@gmail.com b1 1 2 Tom Tom@gmail.com f1 2 3 Bill Bill@gmail.com softball
Résultat: strong>
print (csv1)
0 1 2 3
0 1 Bob Bob@gmail.com baseball
1 2 Tom Tom@gmail.com football
2 3 Bill Bill@gmail.com softball
print (csv2)
0 1
0 baseball b1
1 football f1
Puis après remplacer:
import pandas as pd
# Read in the 2 csv files
csv1 = pd.read_csv('csv1.csv')
csv2 = pd.read_csv('csv2.csv')
#Create dictionary form csv2
replaceDict = pd.Series(csv2.iloc[:,1].values,index=csv2.iloc[:,0]).to_dict()
#Use dictionary to replace values
csv1.iloc[:,-1] = csv1.iloc[:,-1].replace(replaceDict)
# Write to file
csv1.to_csv('csv1_new.csv')
Ça marche. Merci beaucoup. et encore une question. si j'ai besoin de mettre à jour les valeurs de colonnes existantes dans un csv à partir de 3 ou 5 autres documents csv, les étapes devraient-elles être les mêmes?
oui, le concept / les étapes sont les mêmes. Ce que je ferais probablement, c'est combiner tous ces csv "de référence" dans un dictionnaire au départ, puis l'appliquer une fois à csv1.
même si j'ai besoin de remplacer des valeurs dans différentes colonnes?
vous devrez ajuster .iloc [:, - 1] dans le code pour refléter les colonnes souhaitées. Est-il possible que vous puissiez modifier votre question originale pour fournir le scénario supplémentaire et que je puisse vous montrer / ajuster ma solution?
Merci. ce serait génial. J'ai ajouté une autre version à ma question.
@Juliya, je ne vois pas de problème avec votre code. Ça ne marche pas? Serait-il possible de m'envoyer un e-mail? Y compris ces 4 csv? jason.schvach@gmail.com
Ça marche. J'ai juste pensé que ce n'était pas optimal et que je devais le raccourcir d'une manière ou d'une autre. Néanmoins, merci beaucoup pour votre aide.
Si je comprends bien,
csv2.csvcontient une table de traduction pour chaque valeur possible dans la troisième colonne decsv1.csv?@HampusLarsson oui, c'est vrai. Ce n'est qu'un échantillon. En réalité, la première table est beaucoup plus grande.