Yeni bir panda sütunu oluşturmak için işlevi birden çok bağımsız değişkenle uygulama


165

pandasVarolan iki sütuna bir işlev uygulayarak veri çerçevesinde yeni bir sütun oluşturmak istiyorum . Bu cevabın ardından, yalnızca bir sütuna bağımsız değişken olarak ihtiyaç duyduğumda yeni bir sütun oluşturabildim:

import pandas as pd
df = pd.DataFrame({"A": [10,20,30], "B": [20, 30, 10]})

def fx(x):
    return x * x

print(df)
df['newcolumn'] = df.A.apply(fx)
print(df)

Ancak, işlev birden çok bağımsız değişken gerektirdiğinde aynı şeyi nasıl yapacağımı anlayamıyorum. Örneğin, aşağıdaki işleve A ve B sütunlarını ileterek nasıl yeni bir sütun oluşturabilirim?

def fxy(x, y):
    return x * y

Yanıtlar:


136

Alternatif olarak, altta yatan numpy işlevini kullanabilirsiniz:

>>> import numpy as np
>>> df = pd.DataFrame({"A": [10,20,30], "B": [20, 30, 10]})
>>> df['new_column'] = np.multiply(df['A'], df['B'])
>>> df
    A   B  new_column
0  10  20         200
1  20  30         600
2  30  10         300

veya keyfi bir işlevi genel olarak vektörize edin:

>>> def fx(x, y):
...     return x*y
...
>>> df['new_column'] = np.vectorize(fx)(df['A'], df['B'])
>>> df
    A   B  new_column
0  10  20         200
1  20  30         600
2  30  10         300

2
Cevap için teşekkürler! Merak ediyorum, bu en hızlı çözüm mü?
— MV23

6
Vectorized sürümü kullanarak np.vectorize()inanılmaz derecede hızlı. Teşekkür ederim.
— stackoverflowuser2010

Bu yararlı bir çözümdür. X ve y işlevine giriş bağımsız değişkenlerinin boyutu eşit değilse bir hata alırsınız. Bu durumda, @RomanPekar çözümü sorunsuz çalışır. Performansı karşılaştırmadım.
— Ehsan Sadr

Bunun eski bir cevap olduğunu biliyorum, ama: İçinde np.vectorizeçalışmayan bir kenar durumum var . Bunun nedeni, sütunlardan birinin , vektörleştirme ile pandas._libs.tslibs.timestamps.Timestamptüre dönüştürülen tipte olmasıdır numpy.datetime64. İki tür birbirinin yerine kullanılamaz ve bu da işlevin kötü davranmasına neden olur. Bu konuda herhangi bir öneriniz var mı? (Bundan .applykaçınılması gerektiği gibi)
— ElRudi

Harika bir çözüm! herkesin vectorize'ın iyi çalıştığını ve dize karşılaştırma işlevleri için de süper hızlı olduğunu merak etmesi durumunda.
— infiniteloop

227

İşlevinizi yeniden yazmanız mümkünse @greenAfrican örneğiyle gidebilirsiniz. Ancak, işlevinizi yeniden yazmak istemiyorsanız, uygula içindeki anonim işleve sarın, örneğin:

>>> def fxy(x, y):
...     return x * y

>>> df['newcolumn'] = df.apply(lambda x: fxy(x['A'], x['B']), axis=1)
>>> df
    A   B  newcolumn
0  10  20        200
1  20  30        600
2  30  10        300

4
Bu harika bir ipucu ve sütun başvurularını (aslında içinde) uygulama çağrısının yakınında bırakır. Bu ucu ve çok sütunlu çıkış ucu @toto_tico 3 sütun giriş, 4 sütun çıkış işlevi oluşturmak için kullanılır! Harika çalışıyor!
— RufusVS

7
Vay be, OP'nin çıplak minimal örneğine odaklanmayan tek kişi sensin, ama tam olarak ihtiyacım olan şey, tüm soruna hitap ediyor! :)
— Matt

38

Bu sorunu çözer:

df['newcolumn'] = df.A * df.B

Ayrıca şunları da yapabilirsiniz:

def fab(row):
  return row['A'] * row['B']

df['newcolumn'] = df.apply(fab, axis=1)

10
Bu cevap bu oyuncak örneğini çözüyor ve gerçek işlevimi yeniden yazmam için yeterli olacak, ancak daha önce tanımlanmış bir işlevi referans sütunlarına yeniden yazmadan nasıl uygulanacağını ele almıyor.
— Michael

23

Aynı anda birden fazla sütun oluşturmanız gerekirse :

  1. Veri çerçevesi oluşturun:

    import pandas as pd
    df = pd.DataFrame({"A": [10,20,30], "B": [20, 30, 10]})
  2. İşlevi oluşturun:

    def fab(row):                                                  
        return row['A'] * row['B'], row['A'] + row['B']
  3. Yeni sütunları atayın:

    df['newcolumn'], df['newcolumn2'] = zip(*df.apply(fab, axis=1))

1
Nasıl tek bir uygulama ile birden çok sütun oluşturabileceğini merak ediyordum! Bunu @Roman Pekar'ın yanıtı, 3 sütun giriş, 4 sütun çıkış işlevi oluşturmak için kullandım! Harika çalışıyor!
— RufusVS

15

Bir dikte tarzı temiz sözdizimi:

df["new_column"] = df.apply(lambda x: x["A"] * x["B"], axis = 1)

veya,

df["new_column"] = df["A"] * df["B"]
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.