天道酬勤,学无止境

查找添加到TableLayoutPanel的控件的行索引(Find row index of control added to TableLayoutPanel)

问题

将控件添加到Windows窗体的TableLayoutPanel中时,我需要采取措施。 我正在处理控件的ParentChanged事件,以了解是否将控件添加到父级(此处为TableLayoutPanel),但是我收到的索引是-1。

TableLayoutPanel t;

private void button1_Click(object sender, EventArgs e)
{
    // this.Text = tableLayoutPanel1.Height.ToString();

    t = new TableLayoutPanel();
    t.Dock = DockStyle.Fill;
    //t.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink;
    t.AutoSize = true;
    //t.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink;
    t.RowStyles.Add(new RowStyle(SizeType.AutoSize));
    t.RowStyles.Add(new RowStyle(SizeType.AutoSize));
    t.ColumnStyles.Add(new ColumnStyle(SizeType.Percent, 50));
    t.ColumnStyles.Add(new ColumnStyle(SizeType.Percent, 50));
    panel1.Controls.Add(t);

    t.CellBorderStyle = TableLayoutPanelCellBorderStyle.Single;


    Label lbl = new Label();
    lbl.ParentChanged += new EventHandler(lbl_ParentChanged);
    lbl.Margin = new System.Windows.Forms.Padding(20, 150, 20, 20);
    lbl.Text = "Hello";
    t.Controls.Add(lbl, 0, 0);
}

void lbl_ParentChanged(object sender, EventArgs e)
{
    Label lbl = (Label)sender;
    int row = t.GetRow(lbl);//here I get row = -1 ??????
}

我需要添加控件的行号。 该控件应采取独立于何时将其添加到TableLayoutPanel的操作。 如何获得?

    void t_ControlAdded(object sender, ControlEventArgs e)
    {
        int row = t.GetRow(e.Control);      //this also gives row = -1      
    }
回答1

如果将新的RowStyles/ColumnStyles添加到TableLayoutPanel ,则需要增加RowCount/ColumnCount 。 之后,您可以轻松使用GetPositionFromControl(Control value)方法。

我认为,在这种情况下, ControlAdded Event是更好的方法。 试一试。

像这样做:

public partial class Form1 : Form
{
    private TableLayoutPanel panel;

    public Form1()
    {
        InitializeComponent();
        InitializeTableLayoutPanel();
    }

    private void Form1_Load(object sender, EventArgs e)
    {
        AddControl(0, 0);
        AddControl(0, 1);
        AddControl(1, 0);
        AddControl(1, 1);
        AddControl(2, 0);
        AddControl(2, 1);
        AddControl(3, 0);
        AddControl(3, 1);
    }

    private void InitializeTableLayoutPanel()
    {
        panel = new TableLayoutPanel();
        panel.Dock = DockStyle.Fill;
        panel.AutoSize = true;
        panel.ColumnStyles.Add(new ColumnStyle(SizeType.Percent, 50));
        panel.ColumnStyles.Add(new ColumnStyle(SizeType.Percent, 50));
        panel.ColumnCount = 2;
        panel.RowStyles.Add(new RowStyle(SizeType.AutoSize));
        panel.RowStyles.Add(new RowStyle(SizeType.AutoSize));
        panel.RowCount = 2;

        panel.CellBorderStyle = TableLayoutPanelCellBorderStyle.Single;
        panel.ControlAdded += new ControlEventHandler(OnControlAdded);

        this.Controls.Add(panel);
    }

    private void OnControlAdded(object sender, ControlEventArgs e)
    {
        if (e.Control != null)
        {
            int column = panel.GetPositionFromControl(e.Control).Column;
            int row = panel.GetPositionFromControl(e.Control).Row;

            MessageBox.Show(string.Format("Column: {0}, Row: {1}", column, row));
        }
    }

    /// <summary>
    /// Add Control to Panel
    /// </summary>
    /// <param name="column">column position</param>
    /// <param name="row">row position</param>
    private void AddControl(int column, int row)
    {
        Label label = new Label();
        label.Font = new Font(new FontFamily("Droid Sans"), 20, FontStyle.Bold);
        label.Name = "label";
        label.Text = "Whoop!";

        if (column < panel.ColumnCount && row < panel.RowCount)
            panel.Controls.Add(label, column, row);
        else
            throw new ArgumentOutOfRangeException();
    }
}
回答2

留下消息(Windows messagequeue消息)后,尝试执行button1_Click的操作:

SynchronizationContext.Current.Post(new SendOrPostCallback(delegate(object state)
{
  //Your code here...
}), true);
回答3

在msdn页面上:

控件的行位置;如果控件的位置由LayoutEngine确定,则为-1。

使用以下内容:

public void ControlAdded(object sender, EventArgs e)
{
    var row = layout.GetPositionFromControl(lbl);//0,0
}

受限制的 HTML

  • 允许的HTML标签:<a href hreflang> <em> <strong> <cite> <blockquote cite> <code> <ul type> <ol start type> <li> <dl> <dt> <dd> <h2 id> <h3 id> <h4 id> <h5 id> <h6 id>
  • 自动断行和分段。
  • 网页和电子邮件地址自动转换为链接。

相关推荐
  • Winforms TableLayoutPanel以编程方式添加行(Winforms TableLayoutPanel adding rows programmatically)
    问题 我已经为此进行了一段时间的战斗,并且发现许多其他人也为TableLayoutPanel(.net 2.0 Winforms)感到挣扎。 问题 我正在尝试采用“空白” tablelayoutpanel,其中定义了10列,然后在运行时以编程方式添加控件行(即,每个单元格一个控件)。 可能有人以为它应该像 myTableLayoutPanel.Controls.Add(myControl, 0 /* Column Index */, 0 /* Row index */); 但这(对我而言)不会添加行。 所以也许添加一个行样式 myTableLayoutPanel.RowStyles.Clear(); myTableLayoutPanel.RowStyles.Add(new RowStyle(SizeType.Absolute, 30F)); 但这也不起作用。 我进行了挖掘,发现myTableLayoutPanel.RowCount用法在设计时间与运行时间之间发生了变化,因此进行了myTableLayoutPanel.RowCount++; 实际上并没有添加另一行,甚至没有为它添加RowStyle条目之前/之后! 我遇到的另一个相关问题是控件将被添加到显示中,但是它们都只是在TableLayoutPanel的0,0点处呈现,此外
  • 在WinForms应用程序中查找集中控件的首选方法是什么?(What is the preferred way to find focused control in WinForms app?)
    问题 在WinForms中查找当前正在接收用户(键盘)输入的控件的首选/最简单方法是什么? 到目前为止,我已经提出了以下建议: public static Control FindFocusedControl(Control control) { var container = control as ContainerControl; return (null != container ? FindFocusedControl(container.ActiveControl) : control); } 从表单中,可以简单地称为(在.NET 3.5及更高版本中,甚至可以将其定义为表单上的扩展方法)- var focused = FindFocusedControl(this); 这样合适吗 有没有我应该使用的内置方法? 请注意,使用层次结构时,仅对ActiveControl的单个调用是不够的。 想象: Form TableLayoutPanel FlowLayoutPanel TextBox (focused) (formInstance).ActiveControl将返回对TableLayoutPanel的引用,而不是TextBox的引用(因为ActiveControl似乎只返回控件树中的直接活动子级,而我正在寻找叶子控件)。 回答1 如果您已经对Windows
  • 在网格行内查找控件(Find Control inside Grid Row)
    问题 我使用父子网格,并在子网格上即时显示/隐藏抛出Java脚本。 和子网格我将运行时与Templatecolumns绑定在一起 GridView NewDg = new GridView(); NewDg.ID = "dgdStoreWiseMenuStock"; TemplateField TOTAL = new TemplateField(); TOTAL.HeaderTemplate = new BusinessLogic.GridViewTemplateTextBox(ListItemType.Header, "TOTAL",e.Row.RowIndex ); TOTAL.HeaderStyle.Width = Unit.Percentage(5.00); TOTAL.ItemTemplate = new BusinessLogic.GridViewTemplateTextBox(ListItemType.Item, "TOTAL", e.Row.RowIndex); NewDg.Columns.Add(TOTAL); NewDg.DataSource = ds; NewDg.DataBind(); NewDg.Columns[1].Visible = false; NewDg.Columns[2].Visible = false; System.IO
  • TableLayoutPanel显示垂直滚动(TableLayoutPanel displays vertical scroll)
    问题 我有TableLayoutPanel用于使用AutoScroll = true动态创建控件。 当我添加新控件时,它工作正常。 但是,当我删除并且所有控件都可见时,垂直滚动是可见的。 一些截图在这里: 预期/正确的滚动可见性: 可见性不正确: 有任何想法吗? 更新:这是一些代码 tableLayoutPanel1.SuspendLayout(); tableLayoutPanel1.RowCount = 0; tableLayoutPanel1.RowStyles.Clear(); tableLayoutPanel1.AutoScroll = true; tableLayoutPanel1.Padding = new Padding(0, 0, SystemInformation.VerticalScrollBarWidth, 0); foreach (var item in objects) { tableLayoutPanel1.RowCount++; tableLayoutPanel1.RowStyles.Add(new RowStyle(SizeType.AutoSize)); tableLayoutPanel1.Controls.Add(CreateNewItem(item)); } tableLayoutPanel1.RowCount++
  • 在Windows窗体中显示控件的集合(Displaying a collection of controls in Windows Forms)
    问题 我想显示以下内容:- 每行都与一个进程有关(诸如PID,Parent等信息)。 用户可以选中该checkbox ,然后单击“启动”按钮以获取有关该过程的一些动态详细信息。 问题在于CheckedListBox控件不允许多于一列,而其他控件(如ListView (允许多列))不允许将诸如checkbox控件嵌入到一列中。 我想知道是否有一个控件,该控件将使我拥有一系列自定义控件,其中每个自定义控件都包含一个checkbox ,“ Some Text和“ Some Dynamic Text 。 如何在Windows窗体中实现? 提前致谢。 回答1 您可以使用以下任一选项: DataGridView (示例) 您可以使用DataGridView来显示不同类型的多个列,包括TextBox , Label , CheckBox , ComboBox , Image , Button , Link 。 您还可以通过自定义绘画或添加新的自定义列类型来自定义网格的外观。 用户控件您可以创建包含所需的任何其他控件的复合控件或UserControl并将其用作行模板,然后可以通过在Panel或FlowLayoutPanel中托管该用户控件的多个实例来显示所有行。 TableLayoutPanel (示例) 您可以使用包含多个列和行的TableLayoutPanel。
  • C#WinForms垂直对齐的文本框等(C# WinForms Vertical Alignment for TextBox, etc)
    问题 我正在一个项目中,更新其WinForms应用程序UI以使其与尺寸更加一致。 默认情况下,即使使用相同的字体,TextBox和ComboBox控件的高度也不同。 我已经能够通过关闭AutoSize来调整文本框的大小,但是文本仍然紧靠控件的顶部,在下面留有空隙。 有什么办法可以使文本在控件中垂直居中吗? 回答1 如果要在AutoSize上关闭AutoSize ,则它必须是Label ,因为TextBox没有AutoSize属性。 Label的TextAlign属性的类型为ContentAligment ,因此您可以设置水平和垂直对齐方式。 由于各种无聊的原因,Windows中的TextBoxes旨在自动将其高度调整为所使用的字体。 要控制文本的高度并使其垂直居中,您可以快速创建一个自定义UserControl ,您可以使用该UserControl替换所有TextBoxes 。 在您的UserControl ,将BorderStyle设置为Fixed3D ,将BackColor为System.Window 。 添加一个TextBox并将其BorderStyle设置为None 。 在控件的Resize事件中,添加代码,使TextBox与用户控件的客户区具有相同的宽度(考虑边框像素),并将其左对齐(即textBox1.Left = 0; )并将其垂直居中(例如textBox1.Top
  • 在运行时动态地将控件添加到TableLayoutPanel(Adding controls to TableLayoutPanel dynamically during runtime)
    问题 我有一个从两列零行开始的TableLayoutPanel。 我需要做的是,动态添加一行,并用不同的控件填充这两个列(将是面板)。 在Form1中,我以这种方式创建TableLayout: TableLayoutPanel Table = new TableLayoutPanel(); Table.Location = new Point(10, 40); Table.Size = new Size(620,100); Table.AutoSize = true; Table.Name = "Desk"; Table.ColumnCount = 2; Table.RowCount = 0; Table.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink; Table.GrowStyle = System.Windows.Forms.TableLayoutPanelGrowStyle.AddRows; this.Controls.Add(Table); 之后,在运行时,我需要多少行,以及是否用面板或某些标签填充它们。 可能在同一行中的左侧是“面板”,右侧是“标签”等。 回答1 使用这样的东西: Table.Controls.Add(new Label { Text = "Type:", Anchor =
  • 在TableLayoutPanel中动态添加行(Add Row Dynamically in TableLayoutPanel)
    问题 我想在c#的Windows窗体的TableLayoutPanel中逐行动态添加这些条目 我怎样才能做到这一点? 回答1 试试下面的代码, // TableLayoutPanel Initialization TableLayoutPanel panel = new TableLayoutPanel(); panel.ColumnCount = 3; panel.RowCount = 1; panel.ColumnStyles.Add(new ColumnStyle(SizeType.Percent, 40F)); panel.ColumnStyles.Add(new ColumnStyle(SizeType.Percent, 30F)); panel.ColumnStyles.Add(new ColumnStyle(SizeType.Percent, 30F)); panel.RowStyles.Add(new RowStyle(SizeType.Absolute, 50F)); panel.Controls.Add(new Label() { Text = "Address" }, 1, 0); panel.Controls.Add(new Label() { Text = "Contact No" }, 2, 0); panel.Controls.Add(new
  • 如何在Winforms设计器中访问继承的控件(How to access inherited controls in the winforms designer)
    问题 我正在制作一些控件,这些控件必须具有相同的外观和一些共同的行为,尽管它们是为不同种类的输入而设计的。 因此,我做了一个继承自UserControl的BaseClass,而我所有的控件都继承自BaseClass。 但是,如果我在设计器中添加了针对BaseClass的控件(如TableLayoutPanel),则在设计继承的类时将无法访问它们。 我看到了TableLayoutPanel,但是即使他是“受保护的”,我也无法通过设计器修改它或将控件放入其中。 我可以通过代码轻松访问它,但是我不想失去使用设计器的能力。 现在,我只是从BaseClass中删除了所有控件,在每个继承的类中添加了布局和所有公共控件,然后使用引用在BaseClass中对其进行操作。 但这一点都不令我满意。 有没有一种方法可以使设计器与继承的受保护成员控件一起使用? 环境:C#、. NET 3.5,Visual Studio 2008 编辑以回答SLaks的建议。 我尝试设置一个属性,尽管我不习惯使用它们,但它似乎不起作用。 这是我尝试的代码: public partial class UserControl1 : UserControl { public UserControl1() { InitializeComponent(); } public TableLayoutPanel
  • Qt 5.12--控件TreeView介绍
    Qt 5.12--控件TreeView介绍 1 简介2 属性2.1 currentIndex : QModelIndex2.2 itemDelegate : Component2.3 model : QAbstractItemModel2.4 rootIndex : QModelIndex2.5 section2.6 selection : ItemSelectionModel 3 信号3.1 activated(index)3.2 clicked(index)3.3 collapsed(index)3.4 doubleClicked(index)3.5 expanded(index)3.6 pressAndHold(index) 4 方法4.1 void collapse(index)4.2 void expand(index)4.3 QModelIndex indexAt( int x, int y)4.4 bool isExpanded(index) 参考 1 简介 提供带有滚动条,样式和标题部分的树形视图。 import 说明 import QtQuick.Controls 1.4 功能引入初始版本 Qt 5.5继承 ScrollView List of All Members for TreeView 2 属性 2.1 currentIndex : QModelIndex
  • 在ListView控件中查找控件(Find Control Inside ListView Control)
    问题 我想在“ ListView”控件中找到ID =“ Label”的“ Label”控件。 我正在尝试使用以下代码执行此操作: ((Label)this.ChatListView.FindControl("Label")).Text = "active"; 但是我遇到了一个例外:对象引用未设置为object的实例。 这是怎么了? 这是aspx代码: <asp:ListView ID="ChatListView" runat="server" DataSourceID="EntityDataSourceUserPosts"> <ItemTemplate> <div class="post"> <div class="postHeader"> <h2><asp:Label ID="Label1" runat="server" Text= '<%# Eval("Title") + " by " + this.GetUserFromPost((Guid?)Eval("AuthorUserID")) %>' ></asp:Label></h2> <asp:Label ID="Label" runat="server" Text="" Visible="True"></asp:Label> <div class="dateTimePost"> <%# Eval("PostDate")%> <
  • 在numpy数组中查找多个值的行索引(Find the row indexes of several values in a numpy array)
    问题 我有一个数组X: X = np.array([[4, 2], [9, 3], [8, 5], [3, 3], [5, 6]]) 我希望在此数组中找到多个值的行的索引: searched_values = np.array([[4, 2], [3, 3], [5, 6]]) 对于此示例,我想要一个类似的结果: [0,3,4] 我有执行此操作的代码,但我认为它过于复杂: X = np.array([[4, 2], [9, 3], [8, 5], [3, 3], [5, 6]]) searched_values = np.array([[4, 2], [3, 3], [5, 6]]) result = [] for s in searched_values: idx = np.argwhere([np.all((X-s)==0, axis=1)])[0][1] result.append(idx) print(result) 我找到了类似问题的答案,但它仅适用于一维数组。 有没有一种方法可以以更简单的方式来完成我想做的事情? 回答1 方法#1 一种方法是使用NumPy广播,就像这样- np.where((X==searched_values[:,None]).all(-1))[1] 方法#2 一种内存有效的方法是将每一行转换为等效的线性索引,然后使用np.in1d,如下所示-
  • iPhone-如何确定自定义UITableViewCell中的哪个按钮被按下(iPhone - How to determine in which cell a button was pressed in a custom UITableViewCell)
    问题 我目前有一个UITableView,其中装有一个位于单独笔尖中的自定义UITableViewCell。 在单元格中,有两个按钮连接到自定义单元格类中的操作。 当我单击一个按钮时,可以调用适当的方法,但是我需要知道按钮被按下的那一行。每个按钮的tag属性都为0。我不需要知道整个单元格的时间被选中,只是在按下特定按钮时,所以我需要知道它在哪一行,以便可以更新适当的对象。 回答1 更简单的解决方案是使用(id)sender定义按钮回调,并使用它来挖掘表行索引。 这里是一些示例代码: - (IBAction)buttonWasPressed:(id)sender { NSIndexPath *indexPath = [self.myTableView indexPathForCell:(UITableViewCell *)[[sender superview] superview]]; NSUInteger row = indexPath.row; // Do something with row index } 您最有可能使用了相同的行索引来创建/填充单元格,因此识别按钮现在应该执行的操作很简单。 无需使用标签并尝试使其保持秩序! 澄清:如果您当前正在使用-(IBAction)buttonWasPressed; 只需将其重新定义为-(IBAction
  • Find row index of control added to TableLayoutPanel
    I need to take an action when a control is added to a TableLayoutPanel in Windows Forms. I am handling ParentChanged event of the control to find out if the control is added to a parent(here TableLayoutPanel), but the index I receive is -1. TableLayoutPanel t; private void button1_Click(object sender, EventArgs e) { // this.Text = tableLayoutPanel1.Height.ToString(); t = new TableLayoutPanel(); t.Dock = DockStyle.Fill; //t.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink; t.AutoSize = true; //t.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink; t.RowStyles.Add(new
  • 如何编写自动缩放为系统字体和dpi设置的WinForms代码?(How to write WinForms code that auto-scales to system font and dpi settings?)
    问题 简介:有很多评论说“ WinForms不能很好地自动缩放到DPI /字体设置;切换到WPF”。 但是,我认为它基于.NET 1.1。 看来他们实际上在.NET 2.0中实现自动缩放方面做得很好。 至少根据我们到目前为止的研究和测试。 但是,如果你们当中的某些人知道得更多,我们很乐意听取您的意见。 (请不要打扰我们应该切换到WPF ...这不是当前的选择。) 问题: WinForms中的哪些内容不能正确自动缩放,因此应避免? 程序员在编写WinForms代码时应遵循哪些设计准则,以使其能够很好地自动缩放? 到目前为止,我们已经确定的设计准则: 请参阅下面的社区Wiki答案。 那些不正确或不足吗? 我们还应该采用其他准则吗? 还有其他需要避免的模式吗? 任何其他对此的指导将不胜感激。 回答1 不支持正确缩放的控件: 具有AutoSize = False Label ,并且继承了Font 。 在控件上明确设置Font ,使其在“属性”窗口中以粗体显示。 ListView列的宽度不能缩放。 重写窗体的ScaleControl来代替它。 看到这个答案 SplitContainer的Panel1MinSize , Panel2MinSize和SplitterDistance属性具有MultiLine = True TextBox和Font继承。 在控件上明确设置Font ,使其在“属性
  • 如何在WinForms中禁用表格面板的水平滚动条(How to disable horizontal scrollbar for table panel in winforms)
    问题 嗨,我有一个tablelayoutpanel,我正在动态地将控件绑定到它。 当项目数超过面板高度时,显然会出现垂直滚动条,这没有问题。 但是同时,即使项目的宽度小于面板的宽度,也会出现水平滚动条。 我该如何预防呢? 回答1 int vertScrollWidth = SystemInformation.VerticalScrollBarWidth; tableLayoutPanel1.Padding = new Padding(0, 0, vertScrollWidth, 0); 回答2 停靠的TableLayoutPanel包含停靠的GroupBoxes和设置为100%宽度的单个Column时,我遇到了这个问题。 我不想为这些设置手动大小-我希望它们随表格一起调整大小。 奇怪的是,将TableLayoutPanel的Right Padding设置为1(而不是滚动条的宽度-如您所料,会留下滚动条大小的间隙)完全解决了该问题。 这是在C#2010 Express,.NET 4,Windows 8中。不知道此合并是否可以在其他变体上使用。 将padding设置为0似乎可以解决IDE中的问题,但是在实际运行时问题仍然存在。 给我闻起来像是TableLayoutPanel中的某种错误……或者也许这只是我拥有的控件和属性的特定组合(这是一个非常复杂的布局)。 回答3
  • C#利用NPOI实现跨Excel数据查找(备件筛选工具)
    备件筛选工具,软件试用链接:https://download.csdn.net/download/weixin_44834086/12404203 备件筛选工具试用链接:https://download.csdn.net/download/weixin_44834086/12404203 软件演示视频链接:https://www.bilibili.com/video/BV145411s7fu/ 设备工程师最常见的一项工作就是备件清单梳理,每次当供应商提供一份元器件清单给我我们后,我们会先进行初步筛选,选出哪些是我们需要的,形成初步的备件清单,但这个清单不能直接提交给采购部,因为这个清单里可能存在库房里已经有的备件,这部分已经有的备件是不需要买的,我们必须把它们筛选出来删掉,才能提交给采购部购买。 怎样才能知道哪些备件是库房里已经有的呢? 你是不是会一个个的在库房台账Excel里按Ctrl+F查找? 或者你把初版备件清单复制到库房台账的Excel里,标记重复项? 当然,这是其中的两种方法,可是你有没有想过,这两种方法是不是就一定能达到我们的目的? 你想想下面这种情况:一个备件供应商提供的型号是“QSL-1/4-10”,但库房台账里的型号却是“QSL 1/4-10”,型号里只是多一个“-”,此时用上述的两种方法搜索是没有匹配的结果的,但实际上这两个型号是一样的,这时你会认为库房买有
  • 使用窗体调整大小调整控件(Resize Controls with Form Resize)
    问题 我已经阅读了几个堆栈溢出问题,但没有找到解决我的问题的有效方法。 每当调整窗体大小时,如何调整控件大小? 我希望它们在表格变大或变小时变大或变小。 在Visual Basic中,使用form.Zoom属性非常容易(当然,它实际上并不需要调整控件的大小,但是可以解决我所需要的内容)。 不幸的是,这在C#winforms中不可用。 这是我没有运气尝试过的其他方法: private void formMain_Resize(object sender, EventArgs e) {/* double scale; this.scaleWidth = (float)this.Width / (float)this.origWidth; this.scaleHeight = (float)this.Height / (float)this.origHeight; if (this.scaleHeight > this.scaleWidth) { scale = this.scaleHeight; } else { scale = this.scaleWidth; } foreach (Control control in this.Controls) { control.Height = (int)(control.Height * this.scaleHeight); control
  • 查找列的最大值,并使用Pandas返回相应的行值(Find maximum value of a column and return the corresponding row values using Pandas)
    问题 我正在尝试使用Python Pandas找到具有最大值的Country & Place 。 这将返回最大值: data.groupby(['Country','Place'])['Value'].max() 但是,如何获得相应的Country和Place名称? 回答1 假设df具有唯一索引,则该行具有最大值: In [34]: df.loc[df['Value'].idxmax()] Out[34]: Country US Place Kansas Value 894 Name: 7 请注意,idxmax返回索引标签。 因此,如果DataFrame在索引中有重复项,则标签可能不会唯一地标识该行,因此df.loc可能返回多个行。 因此,如果df没有唯一索引,则必须按照上述步骤使索引唯一。 取决于DataFrame,有时您可以使用stack或set_index来使索引唯一。 或者,您可以简单地重置索引(这样行将被重新编号,从0开始): df = df.reset_index() 回答2 df[df['Value']==df['Value'].max()] 这将返回整个行的最大值 回答3 我认为返回具有最大值的行的最简单方法是获取其索引。 argmax()可用于返回具有最大值的行的索引。 index = df.Value.argmax() 现在,可以使用索引来获取该特定行的功能:
  • 在Pandas Dataframe中查找空或NaN条目(Find empty or NaN entry in Pandas Dataframe)
    问题 我正在尝试搜索Pandas数据框,以查找缺少条目或NaN条目的位置。 这是我正在使用的数据框: cl_id a c d e A1 A2 A3 0 1 -0.419279 0.843832 -0.530827 text76 1.537177 -0.271042 1 2 0.581566 2.257544 0.440485 dafN_6 0.144228 2.362259 2 3 -1.259333 1.074986 1.834653 system 1.100353 3 4 -1.279785 0.272977 0.197011 Fifty -0.031721 1.434273 4 5 0.578348 0.595515 0.553483 channel 0.640708 0.649132 5 6 -1.549588 -0.198588 0.373476 audio -0.508501 6 7 0.172863 1.874987 1.405923 Twenty NaN NaN 7 8 -0.149630 -0.502117 0.315323 file_max NaN NaN 注意:空白条目是空字符串-这是因为数据帧来自的文件中没有字母数字内容。 如果我有此数据框,如何找到包含NaN或空白条目的索引的列表? 回答1 np.where(pd.isnull(df)