【问题标题】:Selecting rows with similar index names in Pandas在 Pandas 中选择具有相似索引名称的行
【发布时间】:2014-04-06 17:08:54
【问题描述】:

假设我有一个如下形式的 Pandas DataFrame:

     a  b  c
a_1  1  4  2
a_2  3  3  5
a_3  4  7  2
b_1  2  9  8
b_2  7  2  6
b_3  5  4  1
c_1  3  1  3
c_2  8  6  6
c_3  9  3  7

有没有办法只选择名称相似的行?在上面的 DataFrame 的情况下,这意味着只选择以 a 开头的行,或者以 b 开头的行,等等。

【问题讨论】:

    标签: python pandas


    【解决方案1】:

    使用@Akavall 设置代码

    df = pd.DataFrame(data = my_data, index=['a_1', 'a_2', 'b_1', 'b_2'], columns=['a', 'b'])
    
    In [1]: my_data = np.arange(8).reshape(4,2)
    
    In [2]: my_data[0,0] = 4
    
    In [3]: df = pd.DataFrame(data = my_data, index=['a_1', 'a_2', 'b_1', 'b_2'], columns=['a', 'b'])
    
    In [5]: df.filter(regex='a',axis=0)
    Out[5]: 
         a  b
    a_1  4  1
    a_2  2  3
    
    [2 rows x 2 columns]
    

    请注意,一般来说这是一个多索引更好的姿势

    In [6]: df.index = MultiIndex.from_product([['a','b'],[1,2]])
    
    In [7]: df
    Out[7]: 
         a  b
    a 1  4  1
      2  2  3
    b 1  4  5
      2  6  7
    
    [4 rows x 2 columns]
    
    In [8]: df.loc['a']
    Out[8]: 
       a  b
    1  4  1
    2  2  3
    
    [2 rows x 2 columns]
    
    In [9]: df.loc[['a']]
    Out[9]: 
         a  b
    a 1  4  1
      2  2  3
    
    [2 rows x 2 columns]
    

    【讨论】:

    • 对于给定的问题,这是一个比我更好的答案,关于多索引的非常重要的评论,但是我不会删除我的帖子,因为那里有一些额外的信息
    • 多个答案好!他们有理由拥有与 OP 一样的代码,因此您的代码也是有效的。
    • 使用多个索引是一个更好的主意,遗憾的是,在这种情况下,我不能改变 DataFrame 的结构。在处理非常大的 DataFrame 时,您认为这两种方法的性能会有显着差异吗?
    • 嗯,你可以试试。您可以只复制框架并设置索引;做你需要的并转换回来(在 0.14 set_index 会为你做这件事)。只是尝试两种方式。这取决于你要做什么,所以 YMMV
    • 非常好的答案,但是当我尝试df.filter(regex='a',axis=0) 时,我得到:TypeError: filter() got an unexpected keyword argument 'axis'。我正在使用'pandas 0.12.0',所以我猜这是我的问题。你用的是更高版本吗? `熊猫0.13.1'?
    【解决方案2】:

    我认为没有内置的pandas 方法可以做到这一点,但这是一种方法:

    import numpy as np
    import pandas as pd
    
    my_data = np.arange(8).reshape(4,2)
    my_data[0,0] = 4
    
    df = pd.DataFrame(data = my_data, index=['a_1', 'a_2', 'b_1', 'b_2'], columns=['a', 'b'])
    

    结果:

    >>> df
         a  b
    a_1  4  1
    a_2  2  3
    b_1  4  5
    b_2  6  7
    >>> start_with_a = [ind for ind, ele in enumerate(df.index) if ele[0] == 'a']
    >>> start_with_a
    [0, 1]
    >>> df.loc[start_with_a]
         a  b
    a_1  4  1
    a_2  2  3
    

    【讨论】:

      【解决方案3】:

      通常,您可以使用 .index 和 .columns 属性访问行索引和列。

      这样您就可以轻松地以编程方式获取以 a 开头的行

      needed_rows = [row for row in df.index if row.startswith('a')]
      

      那么你可以像这样使用这些行

      df.loc[needed_rows]
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-10-25
        • 2021-10-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-09-30
        • 2020-11-05
        • 1970-01-01
        相关资源
        最近更新 更多