通过 运行 对所有相邻值的函数制作 pandas 系列

Make a pandas series by running a function on all adjacent values

我有一个 pandas 系列 s1,我想通过应用一个函数来创建一个新系列 s2,该函数采用两个输入来创建一个新值。此函数将应用于 s1 上的 2 值 window。结果序列 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'])

根据您的编辑,我们可以尝试使用类似的 .rolling 方法,但 pandas 目前不支持 rolls 中的非数字类型。

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

[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 比理解

快,我会感到惊讶