Вы можете сделать это, используя groupby
для группировки в интересующей колонке, а затем apply
list
для каждой группы:
In [1]:
# create the dataframe
df = pd.DataFrame( {'a':['A','A','B','B','B','C'], 'b':[1,2,5,5,4,6]})
df
Out[1]:
a b
0 A 1
1 A 2
2 B 5
3 B 5
4 B 4
5 C 6
[6 rows x 2 columns]
In [76]:
df.groupby('a')['b'].apply(list)
Out[76]:
a
A [1, 2]
B [5, 5, 4]
C [6]
Name: b, dtype: object
В дополнение к точному и правильному ответу Резы (который я принял как ответ) по этой довольно специализированной теме:
Существует много возможных / жизнеспособных способов подключения дизайнера Winforms и его зависимые объекты (набор инструментов, сетка свойств и т. д.), поэтому последовательность / время добавления определенных сервисов дизайнера в контейнер сервисов области разработки будут отличаться. Некоторые службы должны быть добавлены явно (например, INameCreationService
или IToolboxService
); другие добавляются фреймворком.
Я еще не пришел к выводу, когда именно фреймворк добавляет BehaviorService
к контейнеру сервисов, но я пришел к выводу, что этот сервис добавляется в любой работающий сервис проектирования (то есть тот, который позволяет вам перетащите уже добавленные элементы управления вокруг поверхности дизайна с помощью мыши).
Кроме того, многие объекты в пространстве имен System.ComponentModel.Design
предлагают доступ к набору доступных служб, предоставляя метод GetService()
. (В ответе Резы используется метод GetService
объекта Site.) Если вы обнаружите, что GetService(typeof(BehaviorService))
не может вернуть действительный объект BehaviorService
, это обычно означает, что BehaviorService
еще не еще не было добавлен в область дизайна ... Я говорю "пока", потому что перетаскивание элементов управления, уже размещенных на поверхности конструктора, требует наличия BehaviorService
в контейнере службы хоста. Поэтому, если ваша попытка получить экземпляр BehaviorService
с помощью метода GetService
не удалась, есть вероятность, что BehaviorService
просто еще не был добавлен в конструкторскую среду. Чтобы решить эту проблему, вам обычно нужно просто переместить код для перехвата событий BehaviorService
куда-нибудь вниз по течению.
Чтобы проверить, какие сервисы уже добавлены в область проектирования, вы можете проверить коллекцию объекта ServiceContainer
объекта поверхности проектирования Services
, которая содержит исчерпывающий список сервисов. Как предлагает Реза, хорошим местом для добавления кода, необходимого для подключения к событиям BehaviorService
, является обработчик событий OnHandleCreated
базовой формы.
Вы можете получить BehaviorService
и подписаться на его BeginDrag
и EndDrag
события.
BeginDrag
: Происходит, когда BehaviorService
начинает операцию перетаскивания. EndDrag
: Происходит, когда BehaviorService
завершает операцию перетаскивания. Пример
Сначала необходимо получить экземпляр BehaviorService
, например, если у вас есть доступ к дизайнеру, хосту дизайнера или сайту можно получить службу поведения следующим образом:
var behaviorSvc = (BehaviorService)Site.GetService(typeof(BehaviorService));
Затем подписаться на события:
behaviorSvc.BeginDrag += BehaviorSvc_BeginDrag;
behaviorSvc.EndDrag += BehaviorSvc_EndDrag;
и обрабатывать события:
private void BehaviorSvc_EndDrag(object sender, BehaviorDragDropEventArgs e)
{
}
private void BehaviorSvc_BeginDrag(object sender, BehaviorDragDropEventArgs e)
{
}