Cara menggunakan DF[:] pada Python

View Discussion

Improve Article

Save Article

  • Read
  • Discuss
  • View Discussion

    Improve Article

    Save Article

    Pandas DataFrame.iterrows() is used to iterate over a pandas Data frame rows in the form of (index, series) pair. This function iterates over the data frame column, it will return a tuple with the column name and content in form of series.   

    Syntax: DataFrame.iterrows() Yields: index- The index of the row. A tuple for a MultiIndex data- The data of the row as a Series Returns: it: A generator that iterates over the rows of the frame

    Example 1: 

    Sometimes we need to iter over the data frame rows and columns without using any loops, in this situation Pandas DataFrame.iterrows() plays a crucial role.

    Python3

    import pandas as pd

    df = pd.DataFrame([[2, 2.5, 100, 4.5, 8.8, 95]], columns=[

                      'int', 'float', 'int', 'float', 'float', 'int'])

    itr = next(df.iterrows())[1]

    itr

    Output:

    Cara menggunakan DF[:] pada Python

    In the above example, we use Pandas DataFrame.iterrows() to iter over numeric data frame rows.

    Example 2:

    Python3

    import pandas as pd

    df = pd.DataFrame([['Animal', 'Baby', 'Cat', 'Dog',

                        'Elephant', 'Frog', 'Gragor']])

    itr = next(df.iterrows())[1]

    itr

    Output :

    In the above example, we iter over the data frame having no column names using Pandas DataFrame.iterrows()

    Note: As iterrows returns a Series for each row, it does not preserve dtypes across the rows.


    Pandas iterrows adalah fungsi DataFrame bawaan yang akan membantu Anda mengulang setiap baris. Metode Pandas iterrows() mengembalikan iterator yang berisi indeks setiap baris dan data di setiap baris sebagai Seri. Karena iterrows() mengembalikan iterator, kita dapat menggunakan fungsi berikutnya untuk melihat konten iterator.

    #python #panda

    appdividend.com

    Pandas Iterrows: Cara Mengulangi Baris Pandas - Pandas iterrows adalah fungsi DataFrame bawaan yang akan membantu Anda mengulang setiap baris. Metode Pandas iterrows() mengembalikan iterator yang berisi indeks setiap baris dan data di setiap baris sebagai Seri. Karena iterrows() mengembalikan iterator, kita dapat menggunakan fungsi berikutnya untuk melihat konten iterator.

    Saya memiliki DataFrame dari panda:

    import pandas as pd
    inp = [{'c1':10, 'c2':100}, {'c1':11,'c2':110}, {'c1':12,'c2':120}]
    df = pd.DataFrame(inp)
    print df
    

    Keluaran:

       c1   c2
    0  10  100
    1  11  110
    2  12  120
    

    Sekarang saya ingin beralih di barisan frame ini. Untuk setiap baris saya ingin dapat mengakses elemen-elemennya (nilai dalam sel) dengan nama kolom. Sebagai contoh:

    for row in df.rows:
       print row['c1'], row['c2']
    

    Mungkinkah melakukannya di panda?

    Saya menemukan pertanyaan serupa . Tetapi itu tidak memberi saya jawaban yang saya butuhkan. Misalnya, disarankan untuk menggunakan:

    for date, row in df.T.iteritems():
    

    atau

    for row in df.iterrows():
    

    Tapi saya tidak mengerti apa objek row dan bagaimana saya bisa bekerja dengannya.

    DataFrame.iterrows adalah generator yang menghasilkan indeks dan baris

    for index, row in df.iterrows():
        print(row['c1'], row['c2'])
    
    Output: 
       10 100
       11 110
       12 120
    

    Untuk beralih melalui baris DataFrame di panda, seseorang dapat menggunakan:

    • DataFrame.iterrows ()

      for index, row in df.iterrows():
          print row["c1"], row["c2"]
      
    • DataFrame.itertuples ()

      for row in df.itertuples(index=True, name='Pandas'):
          print getattr(row, "c1"), getattr(row, "c2")
      

    itertuples() seharusnya lebih cepat dari iterrows()

    Tetapi berhati-hatilah, menurut dokumen (panda 0.21.1 saat ini):

    • iterrows: dtype mungkin tidak cocok dari baris ke baris

      Karena iterrows mengembalikan Seri untuk setiap baris, ia tidak mempertahankan dtypes di baris (dtypes disimpan di kolom untuk DataFrames).

    • iterrows: Jangan memodifikasi baris

      Anda harus tidak pernah memodifikasi sesuatu yang Anda ulangi. Ini tidak dijamin berfungsi dalam semua kasus. Bergantung pada tipe data, iterator mengembalikan salinan dan bukan tampilan, dan menulis ke sana tidak akan berpengaruh.

      Gunakan DataFrame.apply () sebagai gantinya:

      new_df = df.apply(lambda x: x * 2)
      
    • itertuples:

      Nama kolom akan diubah namanya menjadi nama posisional jika mereka pengidentifikasi Python tidak valid, diulang, atau mulai dengan garis bawah. Dengan sejumlah besar kolom (> 255), tupel biasa dikembalikan.

    Anda harus menggunakan df.iterrows() . Meskipun iterasi baris demi baris tidak terlalu efisien karena objek Series harus dibuat.

    Meskipun iterrows() adalah pilihan yang baik, terkadang itertuples() dapat menjadi lebih cepat:

    df = pd.DataFrame({'a': randn(1000), 'b': randn(1000),'N': randint(100, 1000, (1000)), 'x': 'x'})
    
    %timeit [row.a * 2 for idx, row in df.iterrows()]
    # => 10 loops, best of 3: 50.3 ms per loop
    
    %timeit [row[1] * 2 for row in df.itertuples()]
    # => 1000 loops, best of 3: 541 µs per loop
    

    Anda juga dapat menggunakan df.apply() untuk beralih pada baris dan mengakses beberapa kolom untuk suatu fungsi.

    docs: DataFrame.apply ()

    def valuation_formula(x, y):
        return x * y * 0.5
    
    df['price'] = df.apply(lambda row: valuation_formula(row['x'], row['y']), axis=1)
    

    Anda dapat menggunakan fungsi df.iloc sebagai berikut:

    for i in range(0, len(df)):
        print df.iloc[i]['c1'], df.iloc[i]['c2']
    

    Saya mencari Bagaimana cara mengulang pada baris DAN kolom dan berakhir di sini jadi:

    for i, row in df.iterrows():
        for j, column in row.iteritems():
            print(column)
    

    T: Bagaimana cara mengulang baris di DataFrame di Pandas?

    Jangan!

    Iterasi dalam panda adalah anti-pola, dan merupakan sesuatu yang hanya ingin Anda lakukan ketika Anda telah kehabisan setiap pilihan lain yang mungkin. Anda tidak boleh mempertimbangkan untuk menggunakan fungsi apa pun dengan "iter" dalam namanya untuk apa pun yang lebih dari beberapa ribu baris atau Anda harus terbiasa dengan lot menunggu.

    Apakah Anda ingin mencetak DataFrame? Gunakan DataFrame.to_string() .

    Apakah Anda ingin menghitung sesuatu? Dalam hal ini, cari metode dalam urutan ini (daftar dimodifikasi dari sini ):

    1. Vektorisasi
    2. Rutinitas cython
    3. List Comprehensions (for loop)
    4. DataFrame.apply()
      saya. Pengurangan itu bisa dilakukan dengan cython
      ii. Iterasi dalam ruang python
    5. DataFrame.itertuples() dan iteritems()
    6. DataFrame.iterrows()

    iterrows dan itertuples (keduanya menerima banyak suara sebagai jawaban atas pertanyaan ini) harus digunakan dalam keadaan yang sangat jarang, seperti menghasilkan objek baris/nametuple untuk pemrosesan sekuensial, yang merupakan satu-satunya fungsi yang berguna untuk fungsi ini.

    Banding ke Otoritas
    Halaman dokumen pada iterasi memiliki kotak peringatan merah besar yang bertuliskan:

    Iterasi melalui objek panda umumnya lambat. Dalam banyak kasus, iterasi secara manual di atas baris tidak diperlukan [...].


    Lebih cepat daripada Looping: Vektorisasi , Cython

    Sejumlah operasi dasar dan perhitungan yang baik "di-vektor-kan" oleh panda (baik melalui NumPy, atau melalui fungsi-fungsi Cythonized). Ini termasuk aritmatika, perbandingan, pengurangan (sebagian besar), pembentukan kembali (seperti berputar), bergabung, dan operasi grup oleh. Lihat dokumentasi pada Fungsi Dasar Esensial untuk menemukan metode vektorisasi yang sesuai untuk masalah Anda.

    Jika tidak ada, jangan ragu untuk menulis sendiri menggunakan ekstensi custom cython .


    Hal Terbaik Berikutnya: Daftar Pemahaman

    Jika Anda melakukan iterasi karena tidak ada solusi vektor yang tersedia, dan kinerja penting (tetapi tidak cukup penting untuk melalui kerumitan cythonisasi kode Anda) gunakan daftar pemahaman, sebagai pilihan terbaik/paling sederhana berikutnya.

    Untuk beralih pada baris menggunakan satu kolom, gunakan

    result = [f(x) for x in df['col']]
    

    Untuk beralih pada baris menggunakan banyak kolom, Anda dapat menggunakan

    # two column format
    result = [f(x, y) for x, y in Zip(df['col1'], df['col2'])]
    
    # many column format
    result = [f(row[0], ..., row[n]) for row in df[['col1', ...,'coln']].values]
    

    Jika Anda memerlukan indeks baris integer saat iterasi, gunakan enumerate :

    result = [f(...) for i, row in enumerate(df[...].values)]
    
    

    (di mana df.index[i] memberi Anda label indeks.)

    Jika Anda bisa mengubahnya menjadi suatu fungsi, Anda bisa menggunakan pemahaman daftar. Anda dapat membuat hal-hal rumit yang semena-mena bekerja melalui kesederhanaan dan kecepatan python mentah.

    Anda dapat menulis iterator Anda sendiri yang mengimplementasikan namedtuple

    from collections import namedtuple
    
    def myiter(d, cols=None):
        if cols is None:
            v = d.values.tolist()
            cols = d.columns.values.tolist()
        else:
            j = [d.columns.get_loc(c) for c in cols]
            v = d.values[:, j].tolist()
    
        n = namedtuple('MyTuple', cols)
    
        for line in iter(v):
            yield n(*line)
    

    Ini secara langsung sebanding dengan pd.DataFrame.itertuples. Saya bertujuan melakukan tugas yang sama dengan lebih efisien.


    Untuk kerangka data yang diberikan dengan fungsi saya:

    list(myiter(df))
    
    [MyTuple(c1=10, c2=100), MyTuple(c1=11, c2=110), MyTuple(c1=12, c2=120)]
    

    Atau dengan pd.DataFrame.itertuples:

    list(df.itertuples(index=False))
    
    [Pandas(c1=10, c2=100), Pandas(c1=11, c2=110), Pandas(c1=12, c2=120)]
    

    Tes komprehensif
    Kami menguji membuat semua kolom tersedia dan mengatur ulang kolom.

    def iterfullA(d):
        return list(myiter(d))
    
    def iterfullB(d):
        return list(d.itertuples(index=False))
    
    def itersubA(d):
        return list(myiter(d, ['col3', 'col4', 'col5', 'col6', 'col7']))
    
    def itersubB(d):
        return list(d[['col3', 'col4', 'col5', 'col6', 'col7']].itertuples(index=False))
    
    res = pd.DataFrame(
        index=[10, 30, 100, 300, 1000, 3000, 10000, 30000],
        columns='iterfullA iterfullB itersubA itersubB'.split(),
        dtype=float
    )
    
    for i in res.index:
        d = pd.DataFrame(np.random.randint(10, size=(i, 10))).add_prefix('col')
        for j in res.columns:
            stmt = '{}(d)'.format(j)
            setp = 'from __main__ import d, {}'.format(j)
            res.at[i, j] = timeit(stmt, setp, number=100)
    
    res.groupby(res.columns.str[4:-1], axis=1).plot(loglog=True);
    

    Untuk mengulang semua baris dalam dataframe Anda dapat menggunakan:

    for x in range(len(date_example.index)):
        print date_example['Date'].iloc[x]
    
     for ind in df.index:
         print df['c1'][ind], df['c2'][ind]
    

    Terkadang pola yang bermanfaat adalah:

    # Borrowing @KutalmisB df example
    df = pd.DataFrame({'col1': [1, 2], 'col2': [0.1, 0.2]}, index=['a', 'b'])
    # The to_dict call results in a list of dicts
    # where each row_dict is a dictionary with k:v pairs of columns:value for that row
    for row_dict in df.to_dict(orient='records'):
        print(row_dict)
    

    Yang mengakibatkan:

    {'col1':1.0, 'col2':0.1}
    {'col1':2.0, 'col2':0.2}
    

    Untuk mengulang semua baris dalam dataframe dan gunakan nilai dari setiap baris mudah , namedtuples dapat dikonversi ke ndarrays. Sebagai contoh:

    df = pd.DataFrame({'col1': [1, 2], 'col2': [0.1, 0.2]}, index=['a', 'b'])
    

    Mengulangi baris:

    for row in df.itertuples(index=False, name='Pandas'):
        print np.asarray(row)
    

    menghasilkan:

    [ 1.   0.1]
    [ 2.   0.2]
    

    Harap dicatat bahwa jika index=True, indeks ditambahkan sebagai elemen pertama dari Tuple , yang mungkin tidak diinginkan untuk beberapa aplikasi.

    Anda juga dapat melakukan pengindeksan numpy untuk peningkatan kecepatan yang lebih besar. Ini tidak benar-benar iterasi tetapi bekerja jauh lebih baik daripada iterasi untuk aplikasi tertentu.

    subset = row['c1'][0:5]
    all = row['c1'][:]
    

    Anda mungkin juga ingin melemparkannya ke sebuah array. Indeks/seleksi ini seharusnya bertindak seperti array Numpy tapi saya mengalami masalah dan perlu dilemparkan

    np.asarray(all)
    imgs[:] = cv2.resize(imgs[:], (224,224) ) #resize every image in an hdf5 file
    

    Mengapa menyulitkan?

    Sederhana.

    import pandas as pd
    import numpy as np
    
    # Here is an example dataframe
    df_existing = pd.DataFrame(np.random.randint(0,100,size=(100, 4)), columns=list('ABCD'))
    
    for idx,row in df_existing.iterrows():
        print row['A'],row['B'],row['C'],row['D']
    

    Contoh ini menggunakan iloc untuk mengisolasi setiap digit dalam bingkai data.

    import pandas as pd
    
     a = [1, 2, 3, 4]
     b = [5, 6, 7, 8]
    
     mjr = pd.DataFrame({'a':a, 'b':b})
    
     size = mjr.shape
    
     for i in range(size[0]):
         for j in range(size[1]):
             print(mjr.iloc[i, j])
    

    Ada begitu banyak cara untuk beralih pada baris dalam bingkai data panda. Satu cara yang sangat sederhana dan intuitif adalah:

    df=pd.DataFrame({'A':[1,2,3], 'B':[4,5,6],'C':[7,8,9]})
    print(df)
    for i in range(df.shape[0]):
        # For printing the second column
        print(df.iloc[i,1])
        # For printing more than one columns
        print(df.iloc[i,[0,2]])
    

    Untuk melihat dan memodifikasi nilai, saya akan menggunakan iterrows(). Dalam for for loop dan dengan menggunakan Tuple membongkar (lihat contoh: i, row), saya menggunakan row untuk hanya melihat nilai dan menggunakan i dengan metode loc ketika saya ingin memodifikasi nilai. Seperti yang dinyatakan dalam jawaban sebelumnya, di sini Anda tidak boleh mengubah sesuatu yang Anda iterasi.

    for i, row in df.iterrows():
        if row['A'] == 'Old_Value':
            df.loc[i,'A'] = 'New_value'  
    

    Di sini row dalam loop adalah salinan dari baris itu, dan bukan tampilan dari itu. Karena itu, Anda TIDAK boleh menulis sesuatu seperti row['A'] = 'New_Value', itu tidak akan mengubah DataFrame. Namun, Anda dapat menggunakan i dan loc dan menentukan DataFrame untuk melakukan pekerjaan.

    Apa itu DataFrame pada Python?

    Data frame merupakan tabel/data tabular dengan array dua dimensi yaitu baris dan kolom. Struktur data ini merupakan cara paling standar untuk menyimpan data. Setiap kolom pada data frame merupakan objek dari Series, dan baris terdiri dari elemen yang ada pada Series.

    Apa kegunaan Pandas?

    Salah satu tools yang mungkin paling sering digunakan oleh data scientist adalah Pandas. Dalam bahasa pemrograman Python, Pandas adalah alat yang sangat berguna sebagai library yang mengatur tata letak data sehingga mudah dicari secara intuitif.

    Apa itu ILOC pada Python?

    Iloc merupakan kependekan dari index location. Sama seperti loc, digunakan untuk menyeleksi data pada lokasi tertentu saja.

    Function apa yang digunakan untuk melihat jumlah baris dan kolom dari suatu data frame?

    info() digunakan untuk menampilkan informasi detail tentang dataframe, seperti jumlah baris data, nama-nama kolom berserta jumlah data dan tipe datanya, dan sebagainya.