3 votes

Remplir des nuls avec les valeurs d'un autre cadre de données dans pandas

J'ai deux dataframes. Dans le cadre de données 1, j'ai une colonne avec des valeurs nulles. Je veux remplir ces valeurs nulles en utilisant les valeurs d'un autre cadre de données, c'est-à-dire dataframe2, en comparant les valeurs des différentes colonnes de chaque cadre de données.

DataFrame 1 :

Col1 Col2
A    Null
B    Null
C    NUll
A    1000
B    1120
C    3200

Cadre de données 2 :

Col1 Col2
A    500
B    110
C    320

Maintenant, je veux remplir les valeurs nulles du premier cadre de données avec les valeurs du deuxième cadre de données où dataframe1.col1 = dataframe2.col1.

Le résultat final souhaité est le suivant :

Col1 Col2
A    500
B    110
C    320
A    1000
B    1120
C    3200

Comment puis-je faire cela dans les Dataframes de Pandas.

4voto

jezrael Points 290608

Vous pouvez utiliser map avec remplacement NaN s par combine_first o fillna :

df1['Col2'] = df1['Col2'].mask(df1['Col2'] == 'Null')
print (df1)
  Col1  Col2
0    A   NaN
1    A   NaN
2    C   NaN
3    A  1000
4    B  1120
5    C  3200

df1['Col2'] = df1['Col2'].combine_first(df1['Col1'].map(df2.set_index('Col1')['Col2']))
#alternative 
#df1['Col2'] = df1['Col2'].fillna(df1['Col1'].map(df2.set_index('Col1')['Col2']))

print (df1)
  Col1  Col2
0    A   500
1    B   110
2    C   320
3    A  1000
4    B  1120
5    C  3200

Détails :

print(df1['Col1'].map(df2.set_index('Col1')['Col2']))
0    500
1    500
2    320
3    500
4    110
5    320
Name: Col1, dtype: int64

print(df2.set_index('Col1')['Col2'])
Col1
A    500
B    110
C    320
Name: Col2, dtype: int64

Une autre solution consiste à filtrer par les valeurs de condition pour map :

m = df1['Col2'] == 'Null'
df1.loc[m, 'Col2'] = df1.loc[m, 'Col1'].map(df2.set_index('Col1')['Col2'])
print (df1)
  Col1  Col2
0    A   500
1    B   110
2    C   320
3    A  1000
4    B  1120
5    C  3200

2voto

Dark Points 20515

Vous pouvez convertir les chaînes de caractères en nan et ensuite combiner les cadres de données, par exemple

df.assign(Col2 = pd.to_numeric(df.Col2,errors='coerce'))\
     .set_index('Col1').combine_first(df2.set_index('Col1')).reset_index())

   Col1    Col2
0    A   500.0
1    A  1000.0
2    B   110.0
3    B  1120.0
4    C   320.0
5    C  3200.0

2voto

jpp Points 83462

Ma méthode standard consiste à combiner series.replace / series.fillna avec series.map(dict).

fill_dict = dataframe2.set_index('Col1')['Col2'].to_dict()
dataframe1['Col2'] = dataframe1['Col2'].replace('Null', dataframe1['Col1'].map(fill_dict))

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X