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.