Saya mencoba mengakses indeks baris dalam fungsi yang diterapkan di seluruh DataFrame
Pandas. Saya punya sesuatu seperti ini:
df = pandas.DataFrame([[1,2,3],[4,5,6]], columns=['a','b','c'])
>>> df
a b c
0 1 2 3
1 4 5 6
dan saya akan mendefinisikan fungsi yang mengakses elemen dengan baris tertentu
def rowFunc(row):
return row['a'] + row['b'] * row['c']
Saya bisa menerapkannya seperti ini:
df['d'] = df.apply(rowFunc, axis=1)
>>> df
a b c d
0 1 2 3 7
1 4 5 6 34
Hebat! Sekarang bagaimana jika saya ingin memasukkan indeks ke dalam fungsi saya? Indeks dari setiap baris yang diberikan DataFrame
sebelum menambahkan d
adalah Index([u'a', u'b', u'c', u'd'], dtype='object')
, tetapi saya ingin 0 dan 1. Jadi saya tidak bisa begitu saja mengaksesrow.index
.
Saya tahu saya bisa membuat kolom sementara di tabel tempat saya menyimpan indeks, tapi saya bertanya-tanya apakah itu disimpan di objek baris di suatu tempat.
apply
? Ini jauh lebih lambat daripada melakukan operasi vektor pada frame itu sendiri. (Kadang-kadang menerapkan adalah cara termudah untuk melakukan sesuatu, dan pertimbangan kinerja sering dilebih-lebihkan, tetapi untuk contoh khusus Anda, semudah itu untuk tidak menggunakannya.)Jawaban:
Untuk mengakses indeks dalam hal ini Anda mengakses
name
atribut:Perhatikan bahwa jika ini benar-benar yang Anda coba lakukan, berikut ini berfungsi dan jauh lebih cepat:
EDIT
Melihat pertanyaan ini 3+ tahun kemudian, Anda dapat melakukan:
tetapi dengan asumsi ini tidak sepele seperti ini, apa pun
rowFunc
yang sebenarnya Anda lakukan, Anda harus menggunakan fungsi vektorisasi, lalu menggunakannya pada indeks df:sumber
name
akan menjadi tupel bernama dalam kasus aMultindex
, sehingga tingkat indeks tertentu dapat ditanyakan oleh namanya.Antara:
1. dengan
row.name
dalamapply(..., axis=1)
panggilan:2. dengan
iterrows()
(lebih lambat)DataFrame.iterrows () memungkinkan Anda melakukan iterasi pada baris, dan mengakses indeksnya:
sumber
Untuk menjawab pertanyaan awal: ya, Anda dapat mengakses nilai indeks baris dalam
apply()
. Ini tersedia di bawah kunciname
dan mengharuskan Anda menentukanaxis=1
(karena lambda memproses kolom dari sebuah baris dan bukan baris dari sebuah kolom).Contoh kerja (panda 0.23.4):
sumber