2017-10-11 82 views
2

基于this questionGroupby + Apply生成不需要的MultiIndex

df = pandas.DataFrame([[2001, "Jack", 77], [2005, "Jack", 44], [2001, "Jill", 93]],columns=['Year','Name','Value']) 

    Year Name Value 
0 2001 Jack 77 
1 2005 Jack 44 
2 2001 Jill 93 

对于每一个独特的名字,我想保留该行拥有最大 年值。在上面的例子中,我想拿到桌子

Year Name Value 
0 2005 Jack 44 
1 2001 Jill 93 

我试图解决与groupby +(apply)这个问题:

df.groupby('Name', as_index=False)\ 
    .apply(lambda x: x.sort_values('Value').head(1)) 
    Year Name Value 
0 0 2001 Jack  44 
1 2 2001 Jill  93 

不是最好的方法,但我更感兴趣在发生什么,为什么。结果有一个MultiIndex,看起来像这样:

MultiIndex(levels=[[0, 1], [0, 2]], 
      labels=[[0, 1], [0, 1]]) 

我不是在寻找一个解决办法。我其实更感兴趣知道为什么发生这种情况,以及如何在不改变方法的情况下防止它发生。

+0

'df.groupby([ '名称'])[[ '年', '值'] MAX() .reset_index()'? –

+0

@StefanoPotter其实,如果我最初的回答是误导性的,我希望摆脱最大行,道歉。 –

+2

每当你使用apply并且数据的长度与它的启动方式不同时,熊猫将使用索引中的分组键。否则,如果您指定不使用分组键,pandas会将数据粘合在一起。如果您将索引指定为false,则熊猫将仅使用分组键的分解版本。 – piRSquared

回答

2

IIUC,使用group_keys=False

df.groupby('Name', group_keys=False).apply(lambda x: x.sort_values('Value').head(1)) 

输出:

Year Name Value 
1 2005 Jack  44 
2 2001 Jill  93 
+0

是的,你理解正确。任何想法为什么多索引创建和'group_keys'如何绕过它? –

+0

根据[文档](https://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.groupby.html#pandas-dataframe-groupby),“group_keys:布尔值,默认为真 致电申请,添加组键索引来识别件“ –

+0

我的意思是,我知道什么文档说,只是我真的没有得到它?看看你能否以我可以遵循的方式解释它。 :p感谢您的帮助。 –