Saya memiliki Pandas DataFrame yang disebut 'dt', yang memiliki dua kolom bernama 'A' dan 'B'. Nilai kolom 'B' adalah array numpy; Sesuatu seperti ini:

index   A   B
0       a   [1,2,3]
1       b   [2,3,4]
2       c   [3,4,5]

Dimana:

type (dt["B"][0])

Kembali: numpy.ndarray

Saya ingin memfilter DataFrame ini untuk mendapatkan DataFrame lain, di mana hanya baris yang memiliki elemen tertentu dalam array numpy yang disimpan di 'B' yang ada.

Saya sudah mencoba ini:

dt [element in dt["B"]]

Jadi misalnya:

dt [2 in dt["B"]]

Harus kembali:

index   A   B
0       a   [1,2,3]
1       b   [2,3,4]

Namun hal ini mengakibatkan error yaitu "KeyError: True"

Jika nilai kolom "B" adalah string, saya dapat melakukan hal yang sama tanpa kesalahan:

dt [dt["B"]==value]

Jadi saya bertanya-tanya mengapa kode saya tidak berfungsi, dan apa artinya "KeyError: True".

Kesalahan lengkapnya adalah ini:

KeyError                                  Traceback (most recent call last)
~/Applications/Conda/lib/python3.7/site-packages/pandas/core/indexes/base.py in get_loc(self, key, method, tolerance)
   2645             try:
-> 2646                 return self._engine.get_loc(key)
   2647             except KeyError:

pandas/_libs/index.pyx in pandas._libs.index.IndexEngine.get_loc()

pandas/_libs/index.pyx in pandas._libs.index.IndexEngine.get_loc()

pandas/_libs/hashtable_class_helper.pxi in pandas._libs.hashtable.PyObjectHashTable.get_item()

pandas/_libs/hashtable_class_helper.pxi in pandas._libs.hashtable.PyObjectHashTable.get_item()

KeyError: True

During handling of the above exception, another exception occurred:

KeyError                                  Traceback (most recent call last)
<ipython-input-151-aa9ea046a48f> in <module>
----> 1 quotes_of_base["BTC" in quotes_of_base["quote"]]

~/Applications/Conda/lib/python3.7/site-packages/pandas/core/frame.py in __getitem__(self, key)
   2798             if self.columns.nlevels > 1:
   2799                 return self._getitem_multilevel(key)
-> 2800             indexer = self.columns.get_loc(key)
   2801             if is_integer(indexer):
   2802                 indexer = [indexer]

~/Applications/Conda/lib/python3.7/site-packages/pandas/core/indexes/base.py in get_loc(self, key, method, tolerance)
   2646                 return self._engine.get_loc(key)
   2647             except KeyError:
-> 2648                 return self._engine.get_loc(self._maybe_cast_indexer(key))
   2649         indexer = self.get_indexer([key], method=method, tolerance=tolerance)
   2650         if indexer.ndim > 1 or indexer.size > 1:

pandas/_libs/index.pyx in pandas._libs.index.IndexEngine.get_loc()

pandas/_libs/index.pyx in pandas._libs.index.IndexEngine.get_loc()

pandas/_libs/hashtable_class_helper.pxi in pandas._libs.hashtable.PyObjectHashTable.get_item()

pandas/_libs/hashtable_class_helper.pxi in pandas._libs.hashtable.PyObjectHashTable.get_item()

KeyError: True
-1
Qunatized 5 Januari 2021, 01:18

3 jawaban

Jawaban Terbaik
  • katakanlah Anda memiliki sesuatu seperti:

          A         B
      0  10   [11, 0]
      1  20  [11, 10]
      2  30  [11, 10]
      3  40   [10, 0]
      4  50   [11, 0]
      5  60   [10, 0]  
    
  • Dan ingin memfilter hanya yang ada dalam array yang berisi 10

          A         B
      1  20  [11, 10]
      2  30  [11, 10]
      3  40   [10, 0]
      5  60   [10, 0]
    
  • Anda dapat menggunakan .apply

      #create the dataframe
      df = pd.DataFrame(columns = ['A','B'])
      df.A = [10,20,30,40,50,60]
      df.B = [[11,0],[11,10],[11,10],[10,0],[11,0],[10,0]]
    
      # results is a boolean indicating whether the value is found in the list
      # apply the filter in the column 'B' of the dataframe
      results = df.B.apply(lambda a: 10 in a)
    
      # filter the dataframe based on the boolean
      df_filtered = df[results]
      print(df_filtered)
    
  • Kemudian Anda mendapatkan:

                A   B
      1         20  [11, 10]
      2         30  [11, 10]
      3         40   [10, 0]
      5         60   [10, 0]
    

Anda dapat menemukan detail selengkapnya di: https:// /pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.apply.html

2
Dontcube 4 Januari 2021, 23:27

Ingat bahwa mengindeks kerangka data memerlukan daftar nilai Benar/Salah, jadi jika Push datang untuk mendorong, Anda masih dapat membuat daftar itu di tempat lain (pemahaman daftar/ untuk loop) dan meneruskannya ke df seperti dt[contructed_true_false_list]. Pastikan ada satu entri per baris df Anda.

Cukup sulit untuk menyarankan solusi tanpa contoh nyata tetapi Anda dapat mencoba sesuatu seperti ini:

[True if np.any(my_np_array == element) else False for my_np_array in dt["B"].values]

1
Manuel Huppertz 4 Januari 2021, 22:36

Saya menggunakan kombinasi jawaban komentator. Perhatikan bahwa ketika saya membaca data dalam daftar datang sebagai string sehingga Anda mungkin harus bermain dengan str(2) bagian dari ini.

df[df.apply(lambda x: True if str(2) in x['B'] else False, axis=1)]

   A        B
0  a  [1,2,3]
1  b  [2,3,4]
1
Jonathan Leon 4 Januari 2021, 23:13