Bagaimana cara mengisi nilai yang hilang berdasarkan kolom lain dalam bingkai data Pandas?

19

Misalkan saya memiliki bingkai data 5 * 3 di mana kolom ketiga berisi nilai yang hilang

1 2 3
4 5 NaN
7 8 9
3 2 NaN
5 6 NaN

Saya berharap untuk menghasilkan nilai untuk aturan berbasis nilai yang hilang itu kolom kedua produk pertama

1 2 3
4 5 20 <--4*5
7 8 9
3 2 6 <-- 3*2
5 6 30 <-- 5*6

Bagaimana saya bisa menggunakan bingkai data? Terima kasih.

Bagaimana cara menambahkan kondisi untuk menghitung nilai yang hilang seperti ini?

if 1st % 2 == 0 then 3rd = 1st * 2nd else 3rd = 1st + 2nd

1 2 3
4 5 20 <-- 4*5 because 4%2==0
7 8 9
3 2 5 <-- 3+2 because 3%2==1
5 6 11 <-- 5+6 because 5%2==1
KyL
sumber
Anda tidak dapat melakukan ini karena ukurannya tidak akan sama
Mayur Dangar
Bisakah Anda memperluas jawaban Anda? Mengapa itu tidak mungkin dan apa yang bisa dia lakukan untuk menyelesaikan masalah?
Damian Melniczuk
hei bahkan saya punya pertanyaan yang sama. tetapi bagaimana jika data yang saya tangani adalah data? itu kondisinya seperti "jika 'bahan' mengandung ayam maka 'ketik' = non-sayuran"
user7389747

Jawaban:

17

Dengan asumsi tiga kolom kerangka data Anda adalah a, bdan c. Ini yang Anda inginkan:

df['c'] = df.apply(
    lambda row: row['a']*row['b'] if np.isnan(row['c']) else row['c'],
    axis=1
)

Kode lengkap:

df = pd.DataFrame(
    np.array([[1, 2, 3], [4, 5, np.nan], [7, 8, 9], [3, 2, np.nan], [5, 6, np.nan]]), 
    columns=['a', 'b', 'c']
)
df['c'] = df.apply(
    lambda row: row['a']*row['b'] if np.isnan(row['c']) else row['c'],
    axis=1
)
Icyblade
sumber
Beberapa tahun terlambat tetapi ini hanya berfungsi ketika kolom numerik. np.isnantidak mendukung data non-numerik. Ini bukan masalah di sini karena OP memiliki kolom numerik dan operasi aritmatika tetapi sebaliknya pd.isnullmerupakan alternatif yang lebih baik.
Adarsh ​​Chavakula
3

Pilihan lain:

df.loc[(pd.isnull(df.C)), 'C'] = df.A * df.B

Vishal
sumber
3

Bagaimana dengan menggunakan fillna()metode bingkai data?

df['C'].fillna(df.A * df.B)

yosemite_k
sumber
2

Dengan asumsi bahwa tiga kolom dalam kerangka data Anda adalah a, bdan c. Maka Anda dapat melakukan operasi yang diperlukan seperti ini:

values = df['a'] * df['b']
df['c'] = values.where(df['c'] == np.nan, others=df['c'])
enterML
sumber
1
Ataunp.where(pd.isnull(df.c), df.a * df.b, df.c)
Valentas