【问题标题】:Selection with pandas multiIndexed dataframe使用 pandas multiIndex 数据框进行选择
【发布时间】:2017-08-10 01:32:03
【问题描述】:

我有一个多索引数据框,如下所示:

df.head():

如何选择第一个索引 ==“特定学校名称”的所有行和所有第二个索引(月份列 ==“Jan”)的所有行?

我之前没有使用过 multiIndexed 数据帧,我可以像这样选择 Month == "Jan" 的所有行:

df[df['Month'] == 'Jan']

但这给了我所有的学校。我一直在玩它,但无法为一所学校添加索引。那么这是如何工作的呢?

编辑:好的,这样就可以了:df[df['Month'] == 'Mar'].loc["School Name"],但是有没有更惯用的方法或者这是标准的方法?

【问题讨论】:

    标签: python-3.x pandas dataframe indexing multi-index


    【解决方案1】:

    你可以使用query:

    print (df.query('ilevel_0 == "School Name" and Month == "Jan"'))
    

    示例:

    df = pd.DataFrame({'A':['School Name','Agona','another'],
                       'B':[0,1,2],
                       'Month':['Jan', 'Jan', 'Feb']}).set_index(['A','B'])
    df.index.names = [None, None]
    print (df)
                  Month
    School Name 0   Jan
    Agona       1   Jan
    another     2   Feb
    
    print (df.query('ilevel_0 == "School Name" and Month == "Jan"'))
                  Month
    School Name 0   Jan
    
    print (df.query('ilevel_0 == "School Name" & Month == "Jan"'))
                  Month
    School Name 0   Jan
    

    boolean indexing 的解决方案:

    mask = (df.index.get_level_values(0) == 'School Name') & (df['Month'] == 'Jan')
    print (df[mask])
                  Month
    School Name 0   Jan
    

    编辑:

    对于变量使用@:

    var = 'School Name'
    print (df.query('ilevel_0 == @var & Month == "Jan"'))
                  Month
    School Name 0   Jan
    

    【讨论】:

    • 如果School Name 是一个变量,我应该这样做,df.query('ilevel_0 == "'+schools[2]+'" and Month == "Feb"') 还是更好地使用布尔索引,或者我在编辑中添加的方式?
    • 我认为query 在更大的df中尤其是在空间上要快得多,在我看来这里使用query而不是boolean indexing更具可读性。但两种解决方案都适用。
    • 对于变量可以使用@,请参阅最后的编辑。 Docs for multiindex query syntax.
    猜你喜欢
    • 1970-01-01
    • 2018-12-04
    • 2019-12-02
    • 2012-07-28
    • 2018-10-21
    • 1970-01-01
    • 1970-01-01
    • 2019-05-24
    相关资源
    最近更新 更多