2017-11-11 73 views
1

我需要一些帮助清理具有多索引的Dataframe。Pandas multi index Dataframe - 选择并删除

它看起来是这样的

    cost 
location season 
Thorp park autumn £12 
      srping £13 
      summer £22 
Sea life centre summer £34 
       spring £43 
Alton towers  and so on............. 

地点和季节是索引列。我想查看所有数据,并删除所有三季都没有“季节”价值的地点。所以应该删除“海洋生物中心”。

任何人都可以帮助我吗?

还有一个问题,我的数据框是从groupby命令创建的,并没有“成本”列的列名。这是正常的吗?列中有值,只是没有标题。

回答

3

选项1
groupby + count。您可以使用结果来索引您的数据框。

df 

    col 
a 1 0 
    2 1 
b 1 3 
    2 4 
    3 5 
c 2 7 
    3 8 

v = df.groupby(level=0).transform('count').values 
df = df[v == 3] 

df 

    col 
b 1 3 
    2 4 
    3 5 

选项2
groupbyfilter +。这是Paul H's idea,如果他想发布,将会删除。

df.groupby(level=0).filter(lambda g: g.count() == 3) 

    col 
b 1 3 
    2 4 
    3 5 
+0

会'df.groupby(级别= 0).filter(拉姆达G:!g.count()= 3)'有同样的效果? –

+1

@PaulH添加了一个示例 - 您的方法有效。 –

+0

谢谢保罗,有没有办法改变你的建议。这给出的值不是3的值。我想从我的数据框中删除这些值。我试过这个df.groupby(level = 0).filter(lambda g:g.count()= 3),但这不起作用 – SANM2009

2

选项1
条条框框思考...

df.drop(df.count(level=0).col[lambda x: x < 3].index) 

    col 
b 1 3 
    2 4 
    3 5 

同样的事情多了几分稳健性,因为我不依赖于在列值我。

df.drop(df.index.to_series().count(level=0).loc[lambda x: x < 3].index) 

    col 
b 1 3 
    2 4 
    3 5 

选项2
Robustify为随季节的未定数目一般情况。
这使用熊猫版本0.21的groupby.pipe方法

df.groupby(level=0).pipe(lambda g: g.filter(lambda d: len(d) == g.size().max())) 

    col 
b 1 3 
    2 4 
    3 5 
+1

谢谢...... – SANM2009

+0

不客气 – piRSquared

+0

什么是传递给内部lambda? –