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))
4 Réponses :
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.
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.
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
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}
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.
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]
Cela aiderait-il: pandas.pydata.org/ pandas-docs / stable / reference / api /… ?