Saya memiliki beberapa masalah dengan fungsi berlaku Pandas, ketika menggunakan beberapa kolom dengan kerangka data berikut
df = DataFrame ({'a' : np.random.randn(6),
'b' : ['foo', 'bar'] * 3,
'c' : np.random.randn(6)})
dan fungsi berikut
def my_test(a, b):
return a % b
Ketika saya mencoba menerapkan fungsi ini dengan:
df['Value'] = df.apply(lambda row: my_test(row[a], row[c]), axis=1)
Saya mendapatkan pesan kesalahan:
NameError: ("global name 'a' is not defined", u'occurred at index 0')
Saya tidak mengerti pesan ini, saya mendefinisikan nama dengan benar.
Saya akan sangat menghargai bantuan apa pun tentang masalah ini
Memperbarui
Terima kasih atas bantuan Anda. Saya memang membuat beberapa kesalahan sintaks dengan kode, indeks harus diletakkan ''. Namun saya masih mendapatkan masalah yang sama menggunakan fungsi yang lebih kompleks seperti:
def my_test(a):
cum_diff = 0
for ix in df.index():
cum_diff = cum_diff + (a - df['a'][ix])
return cum_diff
apply
sebanyak mungkin. Jika Anda tidak yakin perlu menggunakannya, mungkin Anda tidak menggunakannya. Saya merekomendasikan untuk melihat Kapan saya ingin menggunakan panda apply () dalam kode saya? .my_test(a)
tidak tahu apadf
karena tidak disahkan sebagai argumen (kecualidf
seharusnya menjadi global, yang akan menjadi praktik yang mengerikan). Anda harus melewati semua nilai yang Anda perlukan di dalam suatu fungsi sebagai argumen (lebih disukai dalam urutan), jika tidak, bagaimana lagi fungsi itu tahu dari manadf
datangnya? Selain itu, praktik buruk untuk memprogram dalam namespace yang dipenuhi dengan variabel global, Anda tidak akan mendapatkan kesalahan seperti ini.Jawaban:
Sepertinya Anda lupa
''
string Anda.BTW, menurut saya, cara berikut ini lebih elegan:
sumber
pythonista
karena beberapa perspektif termasuk yang ini.Jika Anda hanya ingin menghitung (kolom a)% (kolom b), Anda tidak perlu
apply
, lakukan saja secara langsung:sumber
Katakanlah kita ingin menerapkan fungsi add5 ke kolom 'a' dan 'b' dari DataFrame df
sumber
Semua saran di atas berfungsi, tetapi jika Anda ingin perhitungan Anda dengan lebih efisien, Anda harus mengambil keuntungan dari operasi vektor numpy (seperti yang ditunjukkan di sini) .
Contoh 1: berulang dengan
pandas.apply()
:Contoh 2: membuat vektor menggunakan
pandas.apply()
:Contoh 3: membuat vektor menggunakan numpy array:
Jadi vektorisasi menggunakan array numpy meningkatkan kecepatan hampir dua urutan besarnya.
sumber
Ini sama dengan solusi sebelumnya tetapi saya telah mendefinisikan fungsi di df.apply sendiri:
sumber
Saya telah memberikan perbandingan ketiganya yang dibahas di atas.
Menggunakan nilai
139 µs ± 1.91 µs per loop (rata-rata ± st. Dev dari 7 run, masing-masing 10.000 loop)
Tanpa nilai
216 µs ± 1.86 µs per loop (rata-rata ± st. Dev dari 7 run, masing-masing 1000 loop)
Terapkan fungsi
474 µs ± 5.07 µs per loop (rata-rata ± st. Dev dari 7 run, masing-masing 1000 loop)
sumber