1
votes

script python pour mettre à jour les valeurs de colonne existantes dans un csv à partir de l'autre csv

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


2 commentaires

Si je comprends bien, csv2.csv contient une table de traduction pour chaque valeur possible dans la troisième colonne de csv1.csv ?


@HampusLarsson oui, c'est vrai. Ce n'est qu'un échantillon. En réalité, la première table est beaucoup plus grande.


3 Réponses :


0
votes
baseball, b1
football, f1

0 commentaires

0
votes

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 ..


0 commentaires

0
votes

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')


7 commentaires

Ç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.