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按两列分组,按一个索引提取第一个元素的主要内容,如果未能解决你的问题,请参考以下文章