Немного поздно в игре, но вот способ создать функцию, которая сортирует объекты Pandas Series, DataFrame и multiindex DataFrame с использованием произвольных функций.
Я использую метод df.iloc[index]
который ссылается на строку в серии / DataFrame по позиции (по сравнению с df.loc
, которая ссылается на значение). Используя это, мы просто должны иметь функцию, которая возвращает ряд позиционных аргументов:
def sort_pd(key=None,reverse=False,cmp=None):
def sorter(series):
series_list = list(series)
return [series_list.index(i)
for i in sorted(series_list,key=key,reverse=reverse,cmp=cmp)]
return sorter
Вы можете использовать это для создания пользовательских функций сортировки. Это работает на базе данных, используемой в ответе Энди Хейдена:
df = pd.DataFrame([
[1, 2, 'March'],
[5, 6, 'Dec'],
[3, 4, 'April']],
columns=['a','b','m'])
custom_dict = {'March':0, 'April':1, 'Dec':3}
sort_by_custom_dict = sort_pd(key=custom_dict.get)
In [6]: df.iloc[sort_by_custom_dict(df['m'])]
Out[6]:
a b m
0 1 2 March
2 3 4 April
1 5 6 Dec
Это также работает с объектами мультииндекса DataFrames и Series:
months = ['Jan','Feb','Mar','Apr','May','Jun','Jul','Aug','Sep','Oct','Nov','Dec']
df = pd.DataFrame([
['New York','Mar',12714],
['New York','Apr',89238],
['Atlanta','Jan',8161],
['Atlanta','Sep',5885],
],columns=['location','month','sales']).set_index(['location','month'])
sort_by_month = sort_pd(key=months.index)
In [10]: df.iloc[sort_by_month(df.index.get_level_values('month'))]
Out[10]:
sales
location month
Atlanta Jan 8161
New York Mar 12714
Apr 89238
Atlanta Sep 5885
sort_by_last_digit = sort_pd(key=lambda x: x%10)
In [12]: pd.Series(list(df['sales'])).iloc[sort_by_last_digit(df['sales'])]
Out[12]:
2 8161
0 12714
3 5885
1 89238
Для меня это кажется чистым, но оно использует python, а не полагаться на оптимизированные операции pandas. Я не проводил никаких стресс-тестов, но я бы подумал, что это может замедлить работу на очень больших DataFrames. Не знаете, как производительность сравнивается с добавлением, сортировкой и удалением столбца. Любые советы по ускорению кода будут оценены!
Apple предоставила шаблон наблюдателя в библиотеке Какао под названием NSNotificationCenter.
Основная идея состоит в том, что слушатель регистрируется в вещательной компании с использованием некоторого предопределенного протокола. Позже вещатель получает указание уведомить всех своих слушателей, где он вызывает некоторую функцию для каждого из своих слушателей и передает определенные аргументы. Это позволяет асинхронно передавать сообщения между двумя разными объектами, которым не нужно знать друг о друге, им просто нужно знать о вещателе.
Вы можете найти более подробную информацию об этом здесь: http: // numbergrinder.com/node/32
Делегат приложения - это объект, который получает уведомления, когда объект UIApplication достигает определенных состояний. Во многих отношениях это специализированный шаблон индивидуального наблюдателя.
Вы можете прочитать об этом подробнее здесь: Для чего нужен AppDelegate и как узнать, когда его использовать?
Если вы работаете в фоновом режиме ActionScript, то NSNotification похоже на добавление слушателей к объектам.