2016-04-14 10 views
0

私はpandas系列s1を持っています.2つの入力を取り込んで新しい値を作成する関数を適用して新しい系列s2を作成します。この関数は、s1の2値ウィンドウに適用されます。結果の系列s2は、s1よりも1つ少ない値を持つ必要があります。 これを達成する方法はたくさんありますが、私はそれを非常に効率的に行う方法を探しています。 これはLinux上であり、現在Python 2.7および3.4​​とpandas 15.2を実行していますが、必要ならpandasを更新できます。 ここに私の問題の簡素化があります。私のシリーズは、弦として表現されたミュージカルピッチで構成されています。隣接するすべての値に対して関数を実行してpandasシリーズを作成します。

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

私はこの機能を使用したいのですが、次のシリーズを取得するには、S1に

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

とS1のシフトバージョンを:あなたの編集に対応して

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

を超える場合、私は驚くだろう'apply'が間違っていると、関数funcまたはlambdaを受け取り、0-Nパラメータを取ることができます。生データ、コード、および望ましい出力で問題をよりよく定義する必要があります – EdChum

答えて

1

同様のローリング方法を試してみることもできますが、パンダは現在、ロールで数値以外のタイプをサポートしていません。

だから、我々はリストの内包表記を使用することができます

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

か、適用されます。

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をapplyがどの速く理解

+0

間違いなく動作しますが、ランタイムはまだシリーズの長さに直接リンクされます。私は.apply()や類似のものを利用して、パンダのライブラリにもっと風土病のある解決策を見出そうとしていました。 – Alex

+0

あなたは正しく、ランタイムは基本的に2つの実装で同じです。 – Alex

関連する問題