Ganti nilai kolom berdasarkan dataframe python pandas lain? (pemula) [duplikat]
Saya memiliki 2 dataframe.
Di df1 saya memiliki banyak NaN yang ingin saya gantikan dengan nilai di df2. Jumlah nilai dalam df2 sama dengan jumlah NaN di df1.
Saya telah mencoba untuk bergabung, menggabungkan, dan membuat siklus, tetapi tidak berhasil.
Terima kasih sebelumnya!
pd.Dataframe 1
0 NaN
1 240.0
2 229.0
3 1084.0
4 2078.0
....
Name: Healthcare_1, Length: 9999, dtype: float64
pd.Dataframe 2
0 830.0
6 100.0
7 100.0
8 830.0
9 1046.0
...
Name: Healthcare_1, Length: 4797, dtype: float64
Jawaban
Dalam jawaban saya, saya berasumsi bahwa baris di mana NAN terjadi di DataFrame1 memiliki indeks yang sama dengan baris di DataFrame2 yang perlu menggantikan NAN ini.
Muat modul berikut:
import pandas as pd
import numpy as np
Kami memiliki dua contoh DataFrames:
df1 = pd.DataFrame({'c1': [np.nan, 240, np.nan, 1084, 2078]})
df2 = pd.DataFrame({'c1': [830, 100, 100, 830, 1046]}, index=[0,2,7,8,9])
Tentukan indeks di mana NAN terjadi di df1:
ind = list(np.where(df1['c1'].isnull()))[0]
Periksa di mana indeks ini muncul di df2. Ini harus memberikan array ([True, True, False, False, False]) :
df2.index.isin(list(ind))
Ganti nilai dari df1 dengan nilai dari df2 di indeks ind:
df1[df1.index.isin(ind)] = df2[df2.index.isin(ind)]
Solusi 1 : Gunakan .update () untuk mengganti nilai nan di df1 dengan nilai yang sesuai di df2:
df1 = pd.Series([np.nan, 240, 229, 1084, 2078])
df2 = pd.Series([830, 100, 100, 830, 1046], index=[0, 6, 7, 8, 9])
df1.update(df2)
Solusi 2 : Anda juga dapat menggunakan .combine_first () untuk mengisi nilai np.nan dari dataframe pertama dengan nilai dari dataframe kedua:
df1.combine_first(df2).iloc[df1.index]
Dataframe yang dihasilkan:
0
0 830.0
1 240.0
2 229.0
3 1084.0
4 2078.0