0
votes

Pandas df modifie la valeur d'une ligne dans une colonne en fonction d'une valeur dans un dictionnaire correspondant à une ligne dans une colonne différente

J'ai un df illustré ci-dessous et je souhaite modifier la valeur du "sic_code" en fonction du "code"

J'ai créé un dictionnaire:

for key in comp_dict:
    if df.loc[df["code"] == key]:

et je pensais à quelque chose comme ça, mais je suis resté coincé. Je veux essentiellement changer la valeur de sic_code si le numéro de code est dans mon dictionnaire, par exemple en changeant le sic_code 2834 en 3000 pour le code 1611787

comp_dict = dict(zip(sic_dict_keys, sic_dict_values))

 entrez la description de l'image ici


4 Réponses :


0
votes

Je ne suis pas sûr de ce que vous voulez faire, j'ai écrit le code pour que si une ligne a un sic_code correspondant à une clé de comp_dict, le sic_code est remplacé par la valeur correspondante de comp_dict. Dites-moi si je vous ai trompé. Pour la boucle, je préfère parcourir le dataframe plutôt que le dictionnaire. Par exemple, en utilisant iterrows et iloc , une simple boucle pourrait ressembler à ceci:

for index, row in df.iterrows():
   sic_code = row['sic_code']
   if sic_code in comp_dict.keys():
      df.iloc[index, <index of column sic_code>] = comp_dict[sic_code] 

Ici, si votre dict contient {2834: 3000}, toutes les lignes avec une valeur sic_code 2834 seront remplacées par 30000.


1 commentaires

Certes, son nom est mal nommé mais le code est le code cik, par exemple 1578620, mais les données que j'ai pour lui ont un sic_code de "NY" Je veux changer cette valeur en 7214. Mais tout doit être dynamique car le sic_code de "NY" change pour différentes entreprises, j'ai une liste de quelques centaines de cas où les données de grattage n'étaient pas là, donc je fusionne avec une autre source. Donc, pour toutes les entreprises avec de mauvais sic_codes, je veux le changer en sic_code ou 0 quand je ne peux pas en trouver un à cause de mauvaises données.



0
votes

Voici une approche en deux étapes de la question. Tout d'abord, recherchez les entrées de bloc de données qui existent dans le dictionnaire de code code à sic. Deuxièmement, utilisez la fonction .map () pour mettre à jour le code sic:

                   name  sic_code
code                             
1611787        Advanced      3000
170846            Perth      6221
142529   ATA Creativity      8200

Le bloc de données résultant est:

df = (pd.DataFrame(
    {'code': [1611787, 170846, 142529],
     'name': ['Advanced', 'Perth', 'ATA Creativity'],
     'sic_code': [2834, 6221, 8200]})
      .set_index('code')
     )

# key is `code`; value is `sic_code`
comp_dict = {1611787: 3000}

# find data frame entries such that `code` is in the dictionary
mask = df.index.isin(comp_dict)

# update `sic_code`
df.loc[mask, 'sic_code'] = df.index[mask].map(comp_dict)
df


2 commentaires

Comment rendriez-vous cela dynamique pour de nombreux codes et codes sic?


Le dictionnaire comp_dict peut avoir plusieurs paires clé / valeur. Par exemple, cela remplacerait deux sic_codes: comp_dict = {1611787: 3000, 170846: 4000}



1
votes

Les pandas DataFrame ont une méthode replace pour exactement cette opération:

   a     b
0  1  1000
1  2  2000
2  3   300

qui se traduit par:

import pandas as pd

df = pd.DataFrame(data={'a': [1, 2, 3], 'b': [100, 200, 300]})
rename_dict = {100: 1000, 200: 2000}

df['b'].replace(rename_dict, inplace=True)

print(df)

Vous pouvez omettre inplace = True si vous préférez renvoyer une copie.


0 commentaires

0
votes

Je l'ai fait fonctionner comme je le souhaite, mais je ne sais pas si c'est le plus efficace.

for index, row in df.iterrows():
        print(row['code'], row['sic_code'])
        for key in comp_dict:
            # print(key)
            if row['code'] == key:
                df['sic_code'][index] = comp_dict[key]


0 commentaires