python按两列分组,按一个索引提取第一个元素

Posted

技术标签:

【中文标题】python按两列分组,按一个索引提取第一个元素【英文标题】:python group by two columns, extract first element by one index 【发布时间】:2013-12-04 16:17:42 【问题描述】:

如果我使用 groupby 函数,例如Data.groupby(['id','company']).size(),它会给出如下结果:

id   company 
1    a        2
     b        3
     c        6
2    d        1
     e        5

但是如何提取数字[2,1](每个第零索引级别组的第一个元素,根据第一索引级别组的排序顺序)?

【问题讨论】:

不完全清楚你在追求什么。您想要每个组中第一个尺寸的列表吗? (结果取决于company 的排序方式。)最小的尺寸?您是否特别想要(1, a)(2, d) 的大小? 我只想提取同一个 id 中第一家公司的规模编号(第 3 列)。谢谢 【参考方案1】:

首先,让:

agg_df = Data.groupby(['id','company']).size()

假设您希望每组元素的第一个条目的结果在 MultiIndex 的第零级具有相同的值,并且每个组按您喜欢的第一个索引级别排序。 (更新评论后,这似乎是所需的输出)

unique_zeroth_level = dict(agg_df.index.values).keys()
group_first_vals = [
    agg_df.select(lambda x: x[0]==idx_val, axis=0).head(1).values[0] 
    for idx_val in unique_zeroth_level]

假设您要求得到的 MultiIndex 的第零级的唯一元素

在这种特殊情况下,由于返回的结果是一个系列,你可以利用 unstack 的技巧:

agg_df.unstack(level=0).columns.values

或使用dict 构造函数

dict(agg_df.index.values).keys()

假设您特别想要 (1, 'a')(2, 'd') 的结果,并且您希望通过索引值访问它们(不仅仅是因为它们是它们各自组中的字典第一个条目)

agg_df.ix[[(1, 'a'), (2, 'd')]]

【讨论】:

是的,我想“假设您想要从第一个条目的第一个条目中获得 MultiIndex 的第零级具有相同值的每组元素的结果,并且每个组按第一个索引级别排序随你喜欢。”我也使用了一个更复杂的循环,但正在寻找一种快速的方法来做到这一点。你的代码有效!谢谢! 我可能做过类似agg_df.reset_index().groupby(["id"]).first()[0].tolist() 的操作,但unstack 的技巧很不错。 这是另一个好方法,我只是不知道重新索引是否是个好主意。对于小型 DataFrames,它肯定会更好,这样您就可以直接将 ids 作为一列使用。对于大型 DataFrame,您可能不希望从索引级别中删除重复值以使它们成为列。事实上,我使用 dict 构造函数基本上做同样的事情应该被一个辅助函数代替,该函数使用索引上的迭代器来构建第一级的唯一元素集。 是的,对于小数据,reindex 比 dict 构造函数快得多,但我还没有测试大数据。谢谢!

以上是关于python按两列分组,按一个索引提取第一个元素的主要内容,如果未能解决你的问题,请参考以下文章

Pandas:按两列分组,将第一列组中的第一个值相加

按两列分组并获得第三列的最大值

SQL Server:按两列分组,并将第三列与两组的分叉相加

Pandas:按两个参数分组并按第三个参数排序

按两列排序,为啥不先分组呢?

Python 按两列分组,然后获取最早和最晚日期