Misalnya saya punya DF sederhana:
import pandas as pd
from random import randint
df = pd.DataFrame({'A': [randint(1, 9) for x in xrange(10)],
'B': [randint(1, 9)*10 for x in xrange(10)],
'C': [randint(1, 9)*100 for x in xrange(10)]})
Dapatkah saya memilih nilai dari 'A' yang mana nilai yang sesuai untuk 'B' akan lebih besar dari 50, dan untuk 'C' - tidak sama dengan 900, menggunakan metode dan idiom Pandas?
df.query
danpd.eval
sepertinya cocok untuk kasus penggunaan ini. Untuk informasi tentang rangkaianpd.eval()
fungsi, fitur dan kasingnya , silakan kunjungi Evaluasi Ekspresi Dinamis di panda menggunakan pd.eval () .Jawaban:
Tentu! Mempersiapkan:
Kami dapat menerapkan operasi kolom dan mendapatkan objek Seri boolean:
[Perbarui, untuk beralih ke gaya baru
.loc
]:Dan kemudian kita bisa menggunakan ini untuk mengindeks ke objek. Untuk akses baca, Anda dapat membuat rantai indeks:
tetapi Anda bisa mendapatkan masalah karena perbedaan antara tampilan dan salinan yang melakukan ini untuk akses tulis. Anda bisa menggunakan
.loc
:Perhatikan bahwa saya tidak sengaja mengetik
== 900
dan tidak!= 900
, atau~(df["C"] == 900)
, tapi saya terlalu malas untuk memperbaikinya. Latihan untuk pembaca. : ^)sumber
.loc
pembaruan - akan lebih baik jika Anda mengklarifikasi dari mana kami mendapatkan salinan dan di mana pandangan.{TypeError}cannot compare a dtyped [int64] array with a scalar of type [bool]
Solusi lain adalah dengan menggunakan metode kueri :
Sekarang jika Anda ingin mengubah nilai yang dikembalikan di kolom A Anda dapat menyimpan indeksnya:
.... dan gunakan
.iloc
untuk mengubahnya yaitu:sumber
Dan ingatlah untuk menggunakan tanda kurung!
Perlu diingat bahwa
&
operator lebih diutamakan daripada operator seperti>
atau<
dll. Itulah sebabnyamengevaluasi ke
False
. Oleh karena itu jika Anda menggunakanpd.loc
, Anda harus menempatkan tanda kurung di sekitar pernyataan logis Anda, jika tidak Anda akan mendapatkan kesalahan. Itu sebabnya:dari pada
yang akan menghasilkan
sumber
Anda dapat menggunakan panda yang memiliki beberapa fungsi bawaan untuk perbandingan. Jadi jika Anda ingin memilih nilai "A" yang dipenuhi oleh kondisi "B" dan "C" (dengan asumsi Anda ingin mengembalikan objek panda DataFrame)
df[['A']][df.B.gt(50) & df.C.ne(900)]
df[['A']]
akan memberi Anda kembali kolom A dalam format DataFrame.Fungsi panda 'gt' akan mengembalikan posisi kolom B yang lebih besar dari 50 dan 'ne' akan mengembalikan posisi yang tidak sama dengan 900.
sumber