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

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
)

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


3

Bagaimana dengan menggunakan fillna()metode bingkai data?

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


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'])

1
Ataunp.where(pd.isnull(df.c), df.a * df.b, df.c)
— Valentas
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.