Шаг 1. Создайте фрейм данных, в котором хранится счет каждого ненулевого класса в столбцах count
count_df = df.groupby(['Symbol','Year']).size().reset_index(name='counts')
. Шаг 2: Теперь используйте pivot_table для получения нужного кадра данных с подсчетом как для существующих, так и для несуществующие классы.
df_final = pd.pivot_table(count_df,
index=['Symbol','Year'],
values='counts',
fill_value = 0,
dropna=False,
aggfunc=np.sum)
Теперь значения счетчиков можно извлечь как список с помощью команды
list(df_final['counts'])
Я использовал перемещаемый поиск в Шпионе ++ (установленный с VS) для рассмотрения взломанной кнопки на открытом для файла диалоговом окне VS.
Это показало, что это - обычная кнопка окон со стилем, который включает BS_DEFSPLITBUTTON. Это - волшебное ключевое слово, которое получает Вас к некоторым интересным местам, включая
http://www.codeplex.com/windowsformsaero/SourceControl/FileView.aspx?itemId=212902&changeSetId=9930
и здесь
http://msdn.microsoft.com/en-us/library/bb775949.aspx#using_splits
Надежда это помогает Вам.
Править:
Я на самом деле только что попробовал тот код от CodePlex, и он действительно создает кнопку разделения - но действительно необходимо удостовериться, что Вы установили FlatStyle кнопки на 'Систему', а не 'Стандарт', который является значением по умолчанию. Я не побеспокоил к сцеплению материал обработки событий для выпадающего, но это охвачено в ссылке MSDN, я думаю.
Конечно, это только для Vista (но не нуждается Аэро, включил, несмотря на имя на codeplex) - если Вам будет нужна более ранняя поддержка ОС, то Вы вернетесь к рисованию его сами.
Я не думаю, что существует встроенное управление, которое может сделать это в.NET. Я ввожу по абсолютному адресу вокруг в документации MSDN для стандартного Windows Button control, но не похоже, что это там.
Я действительно находил статью Code Project с пользовательской реализацией; это могло бы помочь немногому.
Так как я нашел управление в самом Windows, я надеялся уже найти это встроенным где-нибудь, таким образом, я ничего не должен был добавлять к своей кодовой базе для использования его. Но кнопка разделения в этой ссылке (найденный через предложение MSDN) выглядит довольно многообещающей.
Я попробую его позже сам, но я не знаю, как хорошо это обработает визуальные стили.
Вот моя реализация кнопки разделения. Это не привлекает стрелку, и поведение фокуса/нефокуса немного отличается.
И мой и оригиналы обрабатывают визуальные стили и выглядят большими с Аэро.
На основе http://wyday.com/splitbutton/
using System;
using System.Collections.Generic;
using System.Text;
using System.Windows.Forms;
using System.Windows.Forms.VisualStyles;
using System.Drawing;
using System.ComponentModel;
using System.Diagnostics;
// Original: http://blogs.msdn.com/jfoscoding/articles/491523.aspx
// Wyatt's fixes: http://wyday.com/splitbutton/
// Trimmed down and redone significantly from that version (Nick 5/6/08)
namespace DF
{
public class SplitButton : Button
{
private ContextMenuStrip m_SplitMenu = null;
private const int SplitSectionWidth = 14;
private static int BorderSize = SystemInformation.Border3DSize.Width * 2;
private bool mBlockClicks = false;
private Timer mTimer;
public SplitButton()
{
this.AutoSize = true;
mTimer = new Timer();
mTimer.Interval = 100;
mTimer.Tick += new EventHandler(mTimer_Tick);
}
private void mTimer_Tick(object sender, EventArgs e)
{
mBlockClicks = false;
mTimer.Stop();
}
#region Properties
[DefaultValue(null)]
public ContextMenuStrip SplitMenu
{
get
{
return m_SplitMenu;
}
set
{
if (m_SplitMenu != null)
m_SplitMenu.Closing -=
new ToolStripDropDownClosingEventHandler(m_SplitMenu_Closing);
m_SplitMenu = value;
if (m_SplitMenu != null)
m_SplitMenu.Closing +=
new ToolStripDropDownClosingEventHandler(m_SplitMenu_Closing);
}
}
private void m_SplitMenu_Closing(object sender, ToolStripDropDownClosingEventArgs e)
{
HideContextMenuStrip();
// block click events for 0.5 sec to prevent re-showing the menu
}
private PushButtonState _state;
private PushButtonState State
{
get
{
return _state;
}
set
{
if (!_state.Equals(value))
{
_state = value;
Invalidate();
}
}
}
#endregion Properties
protected override void OnEnabledChanged(EventArgs e)
{
if (Enabled)
State = PushButtonState.Normal;
else
State = PushButtonState.Disabled;
base.OnEnabledChanged(e);
}
protected override void OnMouseClick(MouseEventArgs e)
{
if (e.Button != MouseButtons.Left)
return;
if (State.Equals(PushButtonState.Disabled))
return;
if (mBlockClicks)
return;
if (!State.Equals(PushButtonState.Pressed))
ShowContextMenuStrip();
else
HideContextMenuStrip();
}
protected override void OnMouseEnter(EventArgs e)
{
if (!State.Equals(PushButtonState.Pressed) && !State.Equals(PushButtonState.Disabled))
{
State = PushButtonState.Hot;
}
}
protected override void OnMouseLeave(EventArgs e)
{
if (!State.Equals(PushButtonState.Pressed) && !State.Equals(PushButtonState.Disabled))
{
if (Focused)
{
State = PushButtonState.Default;
}
else
{
State = PushButtonState.Normal;
}
}
}
protected override void OnPaint(PaintEventArgs pevent)
{
base.OnPaint(pevent);
Graphics g = pevent.Graphics;
Rectangle bounds = this.ClientRectangle;
// draw the button background as according to the current state.
if (State != PushButtonState.Pressed && IsDefault && !Application.RenderWithVisualStyles)
{
Rectangle backgroundBounds = bounds;
backgroundBounds.Inflate(-1, -1);
ButtonRenderer.DrawButton(g, backgroundBounds, State);
// button renderer doesnt draw the black frame when themes are off =(
g.DrawRectangle(SystemPens.WindowFrame, 0, 0, bounds.Width - 1, bounds.Height - 1);
}
else
{
ButtonRenderer.DrawButton(g, bounds, State);
}
StringFormat format = new StringFormat();
format.Alignment = StringAlignment.Center;
format.LineAlignment = StringAlignment.Center;
g.DrawString(Text, Font, SystemBrushes.ControlText, bounds, format);
}
private void ShowContextMenuStrip()
{
State = PushButtonState.Pressed;
if (m_SplitMenu != null)
{
m_SplitMenu.Show(this, new Point(0, Height), ToolStripDropDownDirection.BelowRight);
}
}
private void HideContextMenuStrip()
{
State = PushButtonState.Normal;
m_SplitMenu.Hide();
mBlockClicks = true;
mTimer.Start();
}
}
}
Я не имею знакомый с использованием или их, но пытаюсь искать MSDN splitbutton или dropdownbutton. Я думаю, что это подобно тому, что Вы ищете.
Я думаю, что Вы ищете, назван toolStripSplitButton. Это только доступно в toolStrip. Но можно добавить toolStripContainer где угодно на форме и затем поместить toolStrip и toolStripSplitButton в контейнере.
Вы не захотите показывать власти, таким образом, Вы захотите установить свой gripMargin = 0. Можно также установить autosize=true так, чтобы toolstrip соответствовал кнопке. Кнопка будет просто похожа на нормальную кнопку (за исключением части разделения) на Вашей форме.
Я вспомнил, что Кетарин имеет такую кнопку.
Используя Reflector , я нашел отличный элемент управления с открытым исходным кодом под названием wyDay.SplitButton .