IIUC вам нужно:
df.merge(df.groupby('id')['c1'].apply(lambda x : x.max()).reset_index().rename(columns={'c1':'c1_secondLargest'}),on='id')
или:
print(df.merge(df.groupby('id')['c1'].apply(lambda x : x.nlargest(1)).reset_index().rename(columns={'c1':'c1_secondLargest'}).drop('level_1',axis=1),on='id'))
id c1 c1_secondLargest
0 1 3 75
1 1 34 75
2 1 75 75
3 2 84 96
4 2 54 96
5 2 23 96
6 2 96 96
7 3 55 76
8 3 76 76
Так как Вы делаете привязку UI через подписку события, Вы могли бы найти это полезным; это - пример, я записал только что, что шоу, как разделить на подклассы BindingList<T>
так, чтобы уведомления были упорядочены к потоку UI автоматически.
Если нет никакого синхронизирующего контекста (т.е. консольный режим), то он возвращается назад к простому прямому, вызывают, таким образом, нет никаких издержек. При выполнении в потоке UI обратите внимание, что это по существу использует Control.Invoke
, который самостоятельно просто выполняет делегата непосредственно, если это находится на потоке UI. Таким образом, существует только любой переключатель, если данные редактируются от потока неUI - выступы, что мы хотим;-p
Вы ответили на свой собственный quesion:-
Я получаю ошибку при высказывании, что к DataGridView получали доступ от потока кроме потока, на котором он был создан.
WinForms настаивает, что все действия, выполненные на формах и средствах управления, сделаны в контексте потока, в котором была создана форма. Причина этого сложна, но имеет непосредственное отношение к базовому Win32 API. Для получения дополнительной информации посмотрите различные записи на Старой Новой Вещи блог.
То, что необходимо сделать, использовать InvokeRequired и Вызвать методы, чтобы гарантировать, что к средствам управления всегда получают доступ от того же потока (pseudocodeish):
object Form.SomeFunction (args)
{
if (InvokeRequired)
{
return Invoke (new delegate (Form.Somefunction), args);
}
else
{
return result_of_some_action;
}
}
У меня была эта та же проблема прежде. Возможно, эта статья, которую я отправил об этом, может помочь.
http://cyberkruz.vox.com/library/post/net-problem-async-and-windows-forms.html
Я нашел эту статью - "Обновление IBindingList от другого потока" - который обвинил вины BindingList -
Поскольку BindingList не является установкой для асинхронных операций, необходимо обновить BindingList от того же потока, на котором им управляли.
Явно передавая родительскую форму как ISynchronizeInvoke
объект и создание обертки для BindingList<T>
добился цели.