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.