通过在所有相邻值上运行函数来制作一个pandas系列

时间:2016-04-14 20:12:31

标签: python pandas music21

我有一个pandas系列,s1,我想通过应用一个带两个输入来创建一个新值的函数来创建一个新系列s2。此函数将应用于s1上的2值窗口。结果序列s2应该比s1少一个值。 有很多方法可以实现这一目标,但我正在寻找一种非常有效的方法。 这是在Linux上,我目前正在运行python 2.7和3.4以及pandas 15.2,但如果有必要我可以更新pandas。 这是我的问题的简化。我的系列包括表示为弦乐的音乐音高。

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

我想使用这个功能:

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和s1的移位版本上,获得以下系列:

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

1 个答案:

答案 0 :(得分:1)

为了响应您的编辑,我们可以尝试使用类似的.rolling方法,但pandas目前不支持滚动中的非数字类型。

所以,我们可以使用列表理解:

[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比理解更快,我会感到惊讶