panda: Pelbagai Keadaan Semasa Mengindeks Bingkai Data - Gelagat Tidak Intuitif
Apabila memilih baris daripada bingkai data berdasarkan syarat yang melibatkan berbilang lajur, pengguna mungkin menghadapi tingkah laku yang tidak dijangka. Khususnya, pengendali OR dan AND nampaknya berkelakuan bertentangan dengan peranan yang dijangkakan.
Pertimbangkan kod berikut:
<code class="python">import pandas as pd df = pd.DataFrame({'a': range(5), 'b': range(5) }) # Insert -1 values df.loc[1, 'a'] = -1 df.loc[1, 'b'] = -1 df.loc[3, 'a'] = -1 df.loc[4, 'b'] = -1 df1 = df[(df.a != -1) & (df.b != -1)] df2 = df[(df.a != -1) | (df.b != -1)] df_combined = pd.concat([df, df1, df2], axis=1, keys=['Original', 'AND', 'OR']) print(df_combined)</code>
Keputusan:
<code class="python"> Original AND OR a b a b a b 0 0 0 0 0 0 0 1 -1 -1 NaN NaN NaN NaN 2 2 2 2 2 2 2 3 -1 3 NaN NaN -1 3 4 4 -1 NaN NaN 4 -1</code>
Seperti yang diperhatikan , baris dengan satu atau kedua-dua nilai ialah -1 dikekalkan apabila operator OR digunakan (df2), manakala baris dengan sebarang nilai -1 dibuang apabila operator AND digunakan (df1). Tingkah laku ini bercanggah dengan jangkaan intuitif.
Penjelasan
Tingkah laku yang seolah-olah terbalik berpunca daripada perspektif yang diterima pakai dalam keadaan setiap pengendali. Untuk operator DAN:
<code class="python">(df.a != -1) & (df.b != -1)</code>
Syarat berbunyi sebagai "kekalkan baris di mana kedua-dua df.a dan df.b berbeza daripada -1", secara berkesan mengecualikan baris dengan sekurang-kurangnya satu nilai -1.
Sebaliknya, pengendali OR:
<code class="python">(df.a != -1) | (df.b != -1)</code>
Dibaca sebagai "kekalkan baris di mana sama ada df.a atau df.b berbeza daripada -1," secara berkesan mengecualikan baris dengan kedua-dua nilai ialah -1.
Oleh itu, tingkah laku sejajar dengan niat untuk memilih baris untuk dikekalkan, bukannya baris untuk dikecualikan.
Nota tentang Akses Berantai
Coretan kod df ['a'][1] = -1 untuk mengubah suai nilai sel tidak digalakkan. Untuk kejelasan dan ketekalan, adalah disyorkan untuk menggunakan df.loc[1, 'a'] = -1 atau df.iloc[1, 0] = -1 sebaliknya.
Atas ialah kandungan terperinci Mengapakah menggunakan operator OR dalam pengindeksan panda mengekalkan baris dengan nilai -1, manakala operator AND membuangnya, bercanggah dengan jangkaan intuitif?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!