【问题标题】:Filtering Rows using Filter in Pandas Dataframe在 Pandas 数据框中使用过滤器过滤行
【发布时间】:2019-03-29 11:47:32
【问题描述】:

我正在尝试学习使用过滤器根据以下条件获取行。

  1. 检查 col-a 是否包含 T2 和
  2. 检查 col-b 的时间戳是否介于 7 和 9 之间

我认为过滤器是一种很酷的方法,只需几行代码。但是我无法获得满足上述条件的行的所需输出。还有什么其他简单的pythonic方法可以做到这一点(也许在哪里?)。对于理解过滤器如何工作的任何帮助,我将不胜感激。

import pandas as pd

dict = {'col-a': ['abcd.T1.123', 'xyz.T2.456', 'xyz.T2.456'],
        'col-b': ['07:57:00', '09:17:00', '12:57:00'],
        }

# Filtering based on col-a - contains T-id
original_df = pd.DataFrame(dict)
print("\n ORIGINAL DF\n", original_df)
filtered_a_df = original_df.filter(like='.T2', axis=0)
print("\n FILTERED DF\n", filtered_a_df)

# Filtering based on col-b - time between 7 and 9
filtered_b_df = original_df.filter(regex='^0[79]:', axis=0)
print("\n FILTERED DF\n", filtered_b_df)

【问题讨论】:

    标签: python-3.x pandas dataframe filter


    【解决方案1】:

    来自docs

    请注意,此例程不会根据其内容过滤数据框。过滤器应用于索引的标签。

    从您的问题来看,您似乎非常想根据数据框的内容进行过滤。所以你可以使用常规索引:

    filtered_a_df = original_df[original_df['col-a'].str.contains('T2')]
    
    filtered_b_df = original_df[original_df['col-b'].between('07:00:00','09:00:00')]
    
    >>> filtered_a_df
            col-a     col-b
    1  xyz.T2.456  09:17:00
    2  xyz.T2.456  12:57:00
    >>> filtered_b_df
             col-a     col-b
    0  abcd.T1.123  07:57:00
    

    为了进一步解释filter,如果您尝试基于索引进行过滤,您的条件可能会起作用。例如,如果您将df2 作为原始数据框,但将col-a 作为索引,那么您可以使用过滤器:

    df2 = original_df.set_index('col-a')
    >>> df2
                    col-b
    col-a                
    abcd.T1.123  07:57:00
    xyz.T2.456   09:17:00
    xyz.T2.456   12:57:00
    
    # In this case you can use either regex or like arguments
    >>> df2.filter(regex='T2',axis=0)
    
                   col-b
    col-a               
    xyz.T2.456  09:17:00
    xyz.T2.456  12:57:00
    

    或者您也可以过滤列。回到原来的 df,例如,您可以过滤名称中包含 -b 的列:

    >>> original_df.filter(like='-b',axis=1)
          col-b
    0  07:57:00
    1  09:17:00
    2  12:57:00
    

    【讨论】:

    • 但如果我使用axis=0,它会根据行内容进行过滤 - 否?
    • 不,不是内容,索引。 axis=0 将根据索引进行过滤,axis=1 将根据列名进行过滤。正如我发布的引用和文档中所述,此例程不会根据其内容过滤数据框
    • 很高兴我能帮上忙!这是一个奇怪的功能,特别是如果你碰巧来自dplyr 背景,filter 可以做你最初描述的事情
    猜你喜欢
    • 2018-06-07
    • 2018-10-01
    • 2021-10-24
    • 1970-01-01
    • 1970-01-01
    • 2013-09-29
    • 1970-01-01
    • 1970-01-01
    • 2022-09-27
    相关资源
    最近更新 更多