python pandaları: bir seriye argümanları olan bir işlev uygulama


147

Python pandalar bir dizi bağımsız değişkenleri ile bir işlev uygulamak istiyorum:

x = my_series.apply(my_function, more_arguments_1)
y = my_series.apply(my_function, more_arguments_2)
...

Dokümantasyon yöntemini uygulamak bir desteği açıklanır, ancak herhangi bir argüman kabul etmez. Argümanları kabul eden farklı bir yöntem var mı? Alternatif olarak, basit bir geçici çözümü kaçırıyor muyum?

Güncelleme (Ekim 2017): Bu soru başlangıçta pandaların apply()konum ve anahtar kelime argümanlarını işleyecek şekilde güncellendiği ve yukarıdaki dokümantasyon bağlantısının şimdi bunu yansıttığını ve her iki argümanın nasıl dahil edileceğini gösterdiğini unutmayın.


3
Neden sadece kullanmıyorsunuz functools.partial, ya da starmap?
Joel Cornett

Yanıtlar:


170

Pandalar yeni versiyonları yapmak ekstra argümanlar (bkz geçmesine izin yeni belgelere ). Şimdi şunları yapabilirsiniz:

my_series.apply(your_function, args=(2,3,4), extra_kw=1)

Konumsal argümanlar serinin elemanından sonra eklenir .


Pandaların eski sürümleri için:

Dokümantasyon bunu açıkça açıklıyor. Apply yöntemi, tek bir parametreye sahip olması gereken bir python işlevini kabul eder. Daha fazla parametre geçmek istiyorsanız, functools.partialyorumunda Joel Cornett tarafından önerildiği gibi kullanmalısınız .

Bir örnek:

>>> import functools
>>> import operator
>>> add_3 = functools.partial(operator.add,3)
>>> add_3(2)
5
>>> add_3(7)
10

Anahtar kelime bağımsız değişkenlerini kullanarak da iletebilirsiniz partial.

Başka bir yol bir lambda oluşturmak olabilir:

my_series.apply((lambda x: your_func(a,b,c,d,...,x)))

Ama bence partialkullanımı daha iyi.


12
Bir DataFrame uygulama yöntemi args, ek konum bağımsız değişkenleri veya adlandırılmış olanlar için ** kwds tutan bir grup olan bağımsız değişkeni kabul eder . Bunu Series.apply () için de bir sorun yarattım github.com/pydata/pandas/issues/1829
Wouter Overmeire

28
Özellik uygulandı, yaklaşan panda sürümünde olacak
Wes McKinney

4
Bu güzel bir cevap ama ilk 2 / 3'ü artık çok eski. IMO, bu yanıt sadece yeni belgelere bir bağlantı ve konum ve / veya anahtar kelime değişkenleriyle nasıl kullanılacağına dair kısa bir örnek olarak güzel bir şekilde güncellenebilir. Sadece FWIW ve orijinal yanıtın bir eleştirisi değil, özellikle sık sık okunan bir cevap olduğu için güncelleme IMO'sundan faydalanır.
JohnE

@watsonic Belgeler o zamandan beri güncellendi ve eski bağlantılara tıklamak, soruyu çok iyi yanıtlayan mevcut belgelere yol açıyor.
JohnE

Not: Örneğin 'abc', tek bir dize bağımsız değişkeni iletiyorsanız, args=('abc')üç bağımsız değişken olarak değerlendirilir ('a', 'b', 'c'). Bundan kaçınmak için, dizeyi içeren bir demet geçirmeniz ve bunu yapmak için bir virgül içermeniz gerekir:args=('abc',)
Rocky K

82

Adımlar:

  1. Veri çerçevesi oluşturma
  2. İşlev oluşturma
  3. Apply deyiminde işlevin adlandırılmış bağımsız değişkenlerini kullanın.

Misal

x=pd.DataFrame([1,2,3,4])  

def add(i1, i2):  
    return i1+i2

x.apply(add,i2=9)

Bu örneğin sonucu, veri çerçevesindeki her sayının 9 sayısına eklenmesidir.

    0
0  10
1  11
2  12
3  13

Açıklama:

"Ekle" işlevinin iki parametresi vardır: i1, i2. İlk parametre veri çerçevesindeki değer, ikincisi ise "uygula" işlevine ilettiğimiz değerdir. Bu durumda, "i2" anahtar kelime bağımsız değişkenini kullanarak uygulama işlevine "9" iletiyoruz.


2
Tam aradığım şey. Özellikle, bu sadece bir Serisi (veya df) işlemek için özel bir fonksiyon yaratmayı gerektirmez. Mükemmel!
Connor

Geriye kalan tek soru şudur: add (i1) 'deki ilk argümana bir anahtar kelime argümanı nasıl aktarılır ve i2 ile yinelenir?
Connor

Bence bu en iyi cevap
crypdick

43
Series.apply(func, convert_dtype=True, args=(), **kwds)

args : tuple

x = my_series.apply(my_function, args = (arg1,))

11
Teşekkürler! İlk argümandan sonra neden args = (arg1,) virgülüne ihtiyaç duyduğunu açıklayabilir misiniz?
DrMisha

21
@MishaTeplitskiy, Python'un parantez içeriğinin bir uzunluk 1 uzunluğu olduğunu anlaması için virgül kullanmanız gerekir.
prooffreader

3
Ne için argümanlar koymak hakkında func. Eğer başvurmak pd.Series.mean(axis=1)istersem nasıl ekleyebilirim axis=1?
Little Bobby Tables

1
Yan not olarak, <args> parametresini kullanmadan da bir anahtar kelime argümanı ekleyebilirsiniz (örn: x = my_series.apply (my_function, keyword_arg = arg1); burada <keyword_arg>, benim_fonksiyonumun girdi parametreleri arasındadır)
lev

1
bu yanıt çok kısa ve hiçbir şey açıklamıyor
FistOfFury

23

applyAdsız bağımsız değişkenler aracılığıyla, argsparametreye bir demet olarak iletilen veya kwdsparametre tarafından dahili olarak sözlük olarak yakalanan diğer anahtar sözcük bağımsız değişkenleri aracılığıyla çağrılan işleve istediğiniz sayıda bağımsız değişken iletebilirsiniz .

Örneğin, 3 ile 6 arasındaki değerler için True, aksi halde False döndüren bir işlev oluşturalım.

s = pd.Series(np.random.randint(0,10, 10))
s

0    5
1    3
2    1
3    1
4    6
5    0
6    3
7    4
8    9
9    6
dtype: int64

s.apply(lambda x: x >= 3 and x <= 6)

0     True
1     True
2    False
3    False
4     True
5    False
6     True
7     True
8    False
9     True
dtype: bool

Bu anonim işlev çok esnek değil. Serimizde istediğimiz min ve maks değerlerini kontrol etmek için iki argümanla normal bir işlev oluşturalım.

def between(x, low, high):
    return x >= low and x =< high

Adsız argümanları ileterek ilk işlevin çıktısını çoğaltabiliriz args:

s.apply(between, args=(3,6))

Ya da adlandırılmış argümanları kullanabiliriz

s.apply(between, low=3, high=6)

Ya da her ikisinin bir kombinasyonu

s.apply(between, args=(3,), high=6)
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.