0

我有一个 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'])
4

1 回答 1

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)

apply注意,如果比理解更快,我会感到惊讶

于 2016-04-14T20:24:48.710 回答