在熊猫数据框中使用过滤器过滤行

时间:2018-10-25 00:04:25

标签: python-3.x pandas dataframe filter

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

  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)

1 个答案:

答案 0 :(得分:2)

来自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作为索引,则可以使用filter:

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