通过 运行 对所有相邻值的函数制作 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
比理解
快,我会感到惊讶
我有一个 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
比理解