2016-04-14 5 views
0

У меня есть серия pandas, s1, и я хочу создать новую серию s2, применяя функцию, которая принимает два входа для создания одного нового значения. Эта функция будет применена к 2-значному окну на s1. Полученная серия s2 должна иметь меньшее значение, чем s1. Есть много способов сделать это, но я ищу способ сделать это очень эффективно. Это на Linux, и в настоящее время я запускаю python 2.7 и 3.4 и pandas 15.2, хотя я могу обновить pandas, если это необходимо. Вот упрощение моей проблемы. Моя серия состоит из музыкальных смол, представленных в виде строк.Сделайте серию 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']) 
+3

Неправильное 'apply' может принимать пользовательские функции или лямбда и может принимать параметры 0-N, вам нужно лучше определить вашу проблему с необработанными данными, кодом и желаемым результатом. – EdChum

ответ

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 это быстрее, чем постижение

+0

Это решение определенно работают, но время выполнения все равно будет напрямую связано с длиной серии. Я надеялся использовать .apply() или что-то подобное, чтобы найти решение, более эндемичное для библиотеки панд. – Alex

+0

Вы были правы, среда выполнения в основном одинакова для двух реализаций. – Alex

 Смежные вопросы

  • Нет связанных вопросов^_^