3
votes

Remplacer les valeurs dans une colonne pandas en fonction du dictionnaire / du mappage des indices

J'ai le dictionnaire

    Start date      End Date
0       1969           a
1       1971           2
2       76            NaN

J'ai aussi le df suivant:

df = df.replace({'Start date': dicts})

Maintenant, je veux mettre le dictionnaire à la place de une colonne DataFrame

    Start date      End Date
0       w              a
1       A              2
2       B             NaN

Résultat: rien n'a changé :(

Attendu:

dicts: {0: '1969',  1: '1971',  2: '76'}


0 commentaires

3 Réponses :


2
votes

Je pense qu'une option plus appropriée ici serait de convertir votre dict en série et d'appeler update:

dct2 = {df.at[i, 'Start date']: v for i, v in dct.items()}
df.replace({'Start date': dct2})

  Start date End Date
0       1969        a
1       1971        2
2         76      NaN

replace sera ne fonctionne pas, car il nécessite que le dictionnaire contienne {:}, mais vous avez fourni les indices à la place. Donc, en un mot, pour que replace fonctionne, vous devez faire

df['Start date'].update(pd.Series(dct))
df

  Start date End Date
0       1969        a
1       1971        2
2         76      NaN


0 commentaires

1
votes

Vous pouvez également faire quelque chose comme ceci:

import pandas as pd
#Creating Your DataFrame
d= {'Start Date': ['w','a','b'],'End Date': ['a',2,'Nan']}
df=pd.DataFrame(data=d)

#Assigning Your Dict Column
dicts = {0: '1969',  1: '1971',  2: '76'}
df['Start Date']= pd.DataFrame.from_dict(dicts, orient='index')
df

Consultez la documentation du dictionnaire vers dataframe ici: https://pandas.pydata.org/pandas- docs / stable / generated / pandas.DataFrame.from_dict.html


0 commentaires

1
votes

pd.DataFrame.replace remplace par valeur, pas par alignement d'index. Pour ce dernier, une option est de pd .Index.map un index via un dictionnaire:

df['StartDate'] = pd.Series(df.index.map(dicts)).fillna(df['StartDate'])

S'il existe des indices potentiellement non mappés , vous pouvez utiliser fillna avec une série:

dicts = {0: '1969',  1: '1971',  2: '76'}
df['StartDate'] = df.index.map(dicts)

print(df)

  StartDate EndDate
0      1969       a
1      1971       2
2        76     NaN


0 commentaires