Pertanyaan Python: Pandas Series - Mengapa menggunakan loc?


Mengapa kami menggunakan 'loc' untuk pandas dataframe? tampaknya kode berikut dengan atau tanpa menggunakan loc, baik compile anr dijalankan pada kecepatan simulular

%timeit df_user1 = df.loc[df.user_id=='5561']

100 loops, best of 3: 11.9 ms per loop

atau

%timeit df_user1_noloc = df[df.user_id=='5561']

100 loops, best of 3: 12 ms per loop

Jadi mengapa menggunakan loc?

Edit: Ini telah ditandai sebagai pertanyaan duplikat. Tetapi meskipun pandas iloc vs ix vs loc explanation? tidak menyebutkan bahwa *

Anda dapat melakukan pengambilan kolom hanya dengan menggunakan bingkai data    getitem:

*

df['time']    # equivalent to df.loc[:, 'time']

itu tidak mengatakan mengapa kita menggunakan loc, meskipun itu menjelaskan banyak fitur dari loc, pertanyaan spesifik saya adalah 'mengapa tidak hanya menghilangkan loc sama sekali'? yang saya telah menerima jawaban yang sangat rinci di bawah ini.

Juga yang lain memposting jawaban (yang saya tidak berpikir adalah jawaban) sangat tersembunyi dalam diskusi dan setiap orang yang mencari apa yang saya cari akan merasa sulit untuk mencari informasi dan akan jauh lebih baik dilayani oleh jawaban yang diberikan pertanyaan saya.


32
2017-08-11 01:51


asal


Jawaban:


  • Eksplisit lebih baik daripada implisit.

    df[boolean_mask] memilih baris di mana boolean_mask Benar, tetapi ada kasus sudut ketika Anda mungkin tidak ingin: kapan df memiliki label kolom yang dihargai boolean:

    In [229]: df = pd.DataFrame({True:[1,2,3],False:[3,4,5]}); df
    Out[229]: 
       False  True 
    0      3      1
    1      4      2
    2      5      3
    

    Anda mungkin ingin menggunakannya df[[True]] untuk memilih True kolom. Sebaliknya itu menimbulkan a ValueError:

    In [230]: df[[True]]
    ValueError: Item wrong length 1 instead of 3.
    

    Versus menggunakan loc:

    In [231]: df.loc[[True]]
    Out[231]: 
       False  True 
    0      3      1
    

    Sebaliknya, yang berikut tidak naik ValueError meskipun struktur df2 hampir sama dengan df1 atas:

    In [258]: df2 = pd.DataFrame({'A':[1,2,3],'B':[3,4,5]}); df2
    Out[258]: 
       A  B
    0  1  3
    1  2  4
    2  3  5
    
    In [259]: df2[['B']]
    Out[259]: 
       B
    0  3
    1  4
    2  5
    

    Demikian, df[boolean_mask] tidak selalu berperilaku sama seperti df.loc[boolean_mask]. Meskipun ini bisa dibilang kasus penggunaan yang tidak mungkin, saya akan merekomendasikan selalu menggunakan df.loc[boolean_mask] dari pada df[boolean_mask] karena arti dari df.locsintaks adalah eksplisit. Dengan df.loc[indexer] Anda tahu secara otomatis itu df.loc sedang memilih baris. Sebaliknya, tidak jelas apakah df[indexer] akan memilih baris atau kolom (atau menaikkan ValueError) tanpa mengetahui detailnya indexer dan df.

  • df.loc[row_indexer, column_index] dapat memilih baris dan kolom. df[indexer] hanya dapat memilih baris atau kolom tergantung pada jenis nilai dalam indexer dan jenis nilai kolom df telah (sekali lagi, apakah mereka boolean?).

    In [237]: df2.loc[[True,False,True], 'B']
    Out[237]: 
    0    3
    2    5
    Name: B, dtype: int64
    
  • Ketika sepotong dilewatkan ke df.loc titik akhir termasuk dalam rentang. Ketika sepotong dilewatkan ke df[...], irisan ditafsirkan sebagai interval setengah terbuka:

    In [239]: df2.loc[1:2]
    Out[239]: 
       A  B
    1  2  4
    2  3  5
    
    In [271]: df2[1:2]
    Out[271]: 
       A  B
    1  2  4
    

34
2017-08-11 02:08