我正在尝试学习使用过滤器根据以下条件获取行。
我认为过滤器是用几行代码来完成此操作的好方法。但是我无法获得所需的输出,即满足上述条件的行。还有什么其他简单的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)
答案 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