Я не понял названия атрибутов, и вы не упомянули, по каким возрастным группам вам нужно разделить ваши данные. В своем ответе я буду относиться к данным, как если бы атрибуты были:
index, name, age, friend
Чтобы найти количество друзей по имени, я бы предложил вам использовать groupby .
вход:
groups = df.groupby([df.iloc[:,0],df.iloc[:,1]]) # grouping by name(0), age(1)
amount_of_friends_df = groups.size() # gathering amount of friends for a person
print(amount_of_friends_df)
выход:
name age
EUNK 25 1
FBFM 26 1
MYYD 30 1
OBBF 28 2
RJCW 25 1
RQTI 21 1
VLIP 16 1
ZCWQ 18 1
ZMQE 27 1
Чтобы найти количество друзей по возрасту, вы также можете использовать группы
вход:
[113 ]
вывод:
age amount_of_friends
0 16 1
1 18 1
2 21 1
3 25 2
4 26 1
5 27 1
6 28 2
7 30 1
Чтобы подсчитать среднее количество друзей в возрастной группе, вы можете использовать категорий и групповой.
входные данные:
mean_by_age_group_df = age_friends.groupby(pd.cut(age_friends.age,[20,40,60,72]))\
.agg({'amount_of_friends':'mean'})
print(mean_by_age_group_df)
pd.cut возвращает набор функций, которые мы используем для группировки данных. Затем мы используем функцию agg для агрегирования групп в кадре данных.
вывод:
amount_of_friends
age
(20, 40] 1.333333
(40, 60] NaN
(60, 72] NaN
При простом вызове делегата это назовет все целевые методы в порядке. Необходимо использовать GetInvocationList
если Вы хотите выполнить их индивидуально - например:
Cancel
после каждогоЧто касается лучшего способа использовать его: как Вы хотите, чтобы это вело себя? Это не ясно мне..., например, это могло бы удовлетворить дополнительному методу вполне хорошо:
static void InvokeIgnoreErrors(this EventHandler handler,
object sender) {
if(handler != null) {
foreach(EventHandler subHandler in handler.GetInvocationList()) {
subHandler(sender, EventArgs.Empty);
}
}
}
Затем можно просто звонить myHandler.InvokeIgnoreErrors(this);
(например).
Другой пример мог бы быть:
static bool InvokeCheckCancel(this CancelEventHandler handler,
object sender) {
if(handler != null) {
CancelEventArgs args = new CancelEventArgs(false);
foreach(CancelEventHandler subHandler in handler.GetInvocationList()) {
subHandler(sender, args);
if(args.Cancel) return true;
}
}
return false;
}
который останавливается после того, как первое событие запрашивает отмену.
Вместо того, чтобы изменяться, как Вы вызываете события, я думаю, что необходимо рассмотреть обработчики событий. По-моему, методы обработчика событий должны всегда писаться так, они "безопасны", и никогда исключения, которым позволяют, не распространяют. Это особенно важно при обработке событий в коде GUI, где событие вызывается внешним кодом, но хорошей привычкой иметь в любом случае.