Bagaimana cara memuat data secara efektif pada pertanyaan Stack Overflow menggunakan pandas read_clipboard?

Dec 20 2020

Saya melihat banyak pertanyaan panda di Stack Overflow hanya menyertakan beberapa baris data mereka sebagai teks, tanpa kode yang menyertai untuk menghasilkan / mereproduksinya. Saya mengetahui keberadaan read_clipboardtetapi saya tidak dapat menemukan cara secara efektif memanggil fungsi ini untuk membaca data dalam banyak situasi, seperti ketika ada spasi putih di nama header, atau objek Python seperti daftar di kolom.

Bagaimana saya bisa menggunakan pd.read_clipboardlebih efektif untuk membaca data yang ditempelkan dalam format tidak konvensional yang tidak memudahkan pembacaan menggunakan argumen default? Apakah ada situasi di mana read_clipboardkekurangannya?

Jawaban

4 cs95 Dec 20 2020 at 17:46

read_clipboard: Panduan Pemula


read_clipboardbenar-benar merupakan anugrah bagi siapa pun yang mulai menjawab pertanyaan di tag panda . Sayangnya, para veteran panda juga tahu bahwa data yang diberikan dalam pertanyaan tidak selalu mudah untuk dimasukkan ke terminal karena berbagai komplikasi dalam format data yang diposting.

Untungnya, read_clipboardada argumen yang memungkinkan penanganan sebagian besar kasus ini (dan mudah). Berikut beberapa kasus penggunaan umum dan argumennya yang sesuai.


Kasus Penggunaan Umum

read_clipboarddigunakan di read_csvbawah tenda dengan pemisah spasi putih, jadi banyak teknik penguraian data dari CSV yang diterapkan di sini, seperti

  • mengurai kolom dengan spasi dalam data

    • gunakan sepdengan argumen regex. Pertama, pastikan setidaknya ada dua spasi di antara kolom dan paling banyak satu spasi berurutan di dalam data kolom itu sendiri. Kemudian Anda dapat menggunakan sep=r'\s{2,}'yang artinya "pisahkan kolom dengan mencari setidaknya dua spasi putih berturut-turut untuk pemisah" (catatan: engine='python'diperlukan untuk pemisah multichar atau regex):

       df = pd.read_clipboard(..., sep=r'\s{2,}', engine='python')
      

      Lihat juga Bagaimana Anda menangani nama kolom yang memiliki spasi di dalamnya saat menggunakan pd.read_clipboard? .

  • membaca seri, bukan DataFrame

    • digunakan squeeze=true, Anda mungkin juga membutuhkan header=Nonejika baris pertama juga data.

       s = pd.read_clipboard(..., header=None, squeeze=True)
      

      Lihat juga Mungkinkah ada cara yang lebih mudah menggunakan pandas read_clipboard untuk membaca Serial? .

  • memuat data dengan nama tajuk khusus

    • digunakan names=[...]bersama dengan header=Nonedan skiprows=[0]untuk mengabaikan header yang ada.

       df = pd.read_clipboard(..., header=None, names=['a', 'b', 'c'], skiprows=[0])
      
  • memuat data tanpa header apa pun

    • menggunakan header=None
  • atur satu atau lebih kolom sebagai indeks

    • gunakan index_col=[...]dengan label atau indeks yang sesuai
  • tanggal parsing

    • gunakan parse_datesdengan format yang sesuai. Jika melakukan parsing datetimes(yaitu, kolom dengan tanggal dipisahkan oleh stempel waktu), Anda mungkin juga perlu menggunakan sep=r'\s{2,}'sambil memastikan kolom Anda dipisahkan oleh setidaknya dua spasi.

Lihat jawaban saya ini untuk daftar yang lebih lengkap tentang read_csvargumen untuk kasus lain yang tidak tercakup di sini ...


Peringatan

read_clipboardadalah pisau tentara swiss. Namun, itu

  • tidak dapat membaca data dalam format tabel / tabulasi yang cantik (IOW, batas membuatnya lebih sulit)

    • Lihat Membaca dalam kerangka data yang cukup dicetak / diformat menggunakan pd.read_clipboard? untuk solusi untuk mengatasi ini.
  • tidak dapat mengurai MultIndex dengan benar kecuali semua elemen dalam indeks ditentukan.

    • Lihat Menyalin kerangka data MultiIndex dengan pd.read_clipboard? untuk solusi untuk mengatasi ini.
  • tidak bisa mengabaikan / menangani elipsis dalam data

    • metode yang saya sarankan adalah menghapus elipsis secara manual sebelum mencetak
  • tidak dapat mengurai kolom daftar (atau objek lain) sebagai apa pun selain string. Kolom perlu diubah secara terpisah, seperti yang ditunjukkan pada Bagaimana Anda membaca dalam kerangka data dengan daftar menggunakan pd.read_clipboard? .

  • tidak dapat membaca teks dari gambar (jadi tolong jangan gunakan gambar sebagai sarana untuk berbagi data Anda dengan orang-orang, tolong!)

2 etch_45 Dec 20 2020 at 18:23

Satu kelemahan dari fungsi ini adalah bahwa ia tidak menangkap konten CTRL + Cjika penyalinan dilakukan dari sebuah PDFfile. Mengujinya dengan cara ini menghasilkan pembacaan kosong.

Tetapi dengan menggunakan editor teks biasa, itu berjalan dengan baik. Berikut ini contoh penggunaan teks yang diketik secara acak:

>>> pd.read_clipboard()
Empty DataFrame
Columns: [sfsesfsdsxcvfsdf]
Index: []