2016-04-14 24 views
0

Bir panda dizisi var, s1, ve yeni bir seri oluşturmak için iki girişi olan bir işlevi uygulayarak yeni bir seri oluşturmak istiyorum. Bu işlev, s1 üzerindeki 2 değerli bir pencereye uygulanır. Ortaya çıkan seri, s2, s1'den daha az bir değere sahip olmalıdır. Bunu başarmanın birçok yolu var ama bunu çok verimli bir şekilde yapmak için bir yol arıyorum. Bu Linux'ta ve şu anda pandaları güncelleyebilmem için python 2.7 ve 3.4 ve pandalar 15.2 çalışıyorum. İşte benim sorunumun basitleştirilmesi. Dizim dizeler olarak gösterilen müzikal sahalardan oluşmaktadır.Tüm bitişik değerlerde bir işlevi çalıştırarak bir panda dizisi yapın

import pandas 
s1 = pandas.Series(['C4', 'E-4', 'G4', 'A-4') 

Ben bu fonksiyonu kullanmak istiyorum: Aşağıdaki dizi olsun, s1 günü

def interval_func(event1, event2): 
    ev1 = music21.note.Note(event1) 
    ev2 = music21.note.Note(event2) 
    intrvl = music21.interval.Interval(ev1, ev2) 
    return intrvl.name 

ve s1 bir değişik versiyonunu: Düzenlemenizle cevaben

s2 = pandas.Series(['m3', 'M3', 'm2']) 
+3

Yanlış 'Uygula' bir kullanıcı func veya lambda alabilir ve 0-N paramlar alabilir, ham veri, kod ve istenen çıktı ile probleminizi daha iyi tanımlamanız gerekir – EdChum

cevap

1

, benzer bir .rolling yöntemini kullanmayı deneyebiliriz, ancak pandalar şu anda rulolarda sayısal olmayan türleri desteklememektedir.

Yani, bir liste anlama kullanabilirsiniz:

[music21.interval.Interval(music21.note.Note(s1[i]),\ 
          music21.note.Note(s1[i + 1])).name\ 
for i in range(len(s1)-1)] 

veya bir uygulayın:

import music21 
import pandas as pd 
import numpy as np 

s1 = pd.Series(['C4', 'E-4', 'G4', 'A-4']) 
df = pd.DataFrame({0:s1, 1:s1.shift(1)}) 

def myfunc(x): 
    if not any([pd.isnull(x[0]), pd.isnull(x[1])]): 
     return music21.interval.Interval(music21.note.Note(x[0]),music21.note.Note(x[1])).name 


df.apply(myfunc, axis = 1) 

nb, sürpriz olurdu apply daha hızlı anlama daha uzunsa

+0

Bu çözüm kesinlikle çalışır, ancak çalışma zamanı, dizinin uzunluğuna doğrudan bağlı olacaktır. Pandalar kütüphanesine daha endemik bir çözüm bulmak için .apply() veya benzer bir şeyden yararlanmayı umuyordum. – Alex

+0

Haklısınız, çalışma zamanı temel olarak iki uygulama için aynı. – Alex