如何使用Pandas DataFrame的filter方法
在数据分析过程中,我们经常需要对数据进行过滤,以便只保留我们感兴趣的部分。Pandas库提供了一种强大的数据结构DataFrame,它允许我们以各种方式过滤数据。在本文中,我们将详细介绍如何使用Pandas DataFrame的filter方法。
1. filter的基本使用
Pandas DataFrame的filter方法可以用来过滤DataFrame的行或列。它的基本语法如下:
DataFrame.filter(items=None, like=None, regex=None, axis=None)
参数说明:
- items:要过滤的列或行的名字列表。
- like:一个字符串,用来过滤列或行的名字,只保留包含该字符串的列或行。
- regex:一个正则表达式,用来过滤列或行的名字,只保留匹配该正则表达式的列或行。
- axis:过滤的轴,0或’index’表示过滤行,1或’columns’表示过滤列。
下面我们通过一些示例来说明如何使用filter方法。
示例1:使用items参数过滤列
import pandas as pd
data = {
'Name': ['Tom', 'Nick', 'John', 'Tom'],
'Age': [20, 21, 19, 18],
'Email': ['tom@pandasdataframe.com', 'nick@pandasdataframe.com', 'john@pandasdataframe.com', 'tom@pandasdataframe.com']
}
df = pd.DataFrame(data)
filtered_df = df.filter(items=['Name', 'Email'])
print(filtered_df)
Output:
在这个示例中,我们创建了一个包含三列的DataFrame,然后使用filter方法过滤出’Name’和’Email’两列。
示例2:使用like参数过滤列
import pandas as pd
data = {
'Name': ['Tom', 'Nick', 'John', 'Tom'],
'Age': [20, 21, 19, 18],
'Email': ['tom@pandasdataframe.com', 'nick@pandasdataframe.com', 'john@pandasdataframe.com', 'tom@pandasdataframe.com']
}
df = pd.DataFrame(data)
filtered_df = df.filter(like='Ema')
print(filtered_df)
Output:
在这个示例中,我们使用like参数过滤出包含’Ema’的列,即’Email’列。
示例3:使用regex参数过滤列
import pandas as pd
data = {
'Name': ['Tom', 'Nick', 'John', 'Tom'],
'Age': [20, 21, 19, 18],
'Email': ['tom@pandasdataframe.com', 'nick@pandasdataframe.com', 'john@pandasdataframe.com', 'tom@pandasdataframe.com']
}
df = pd.DataFrame(data)
filtered_df = df.filter(regex='^E')
print(filtered_df)
Output:
在这个示例中,我们使用regex参数过滤出以’E’开头的列,即’Email’列。
示例4:使用axis参数过滤行
import pandas as pd
data = {
'Name': ['Tom', 'Nick', 'John', 'Tom'],
'Age': [20, 21, 19, 18],
'Email': ['tom@pandasdataframe.com', 'nick@pandasdataframe.com', 'john@pandasdataframe.com', 'tom@pandasdataframe.com']
}
df = pd.DataFrame(data, index=['a', 'b', 'c', 'd'])
filtered_df = df.filter(items=['a', 'c'], axis=0)
print(filtered_df)
Output:
在这个示例中,我们创建了一个包含三列的DataFrame,并为每行指定了一个标签。然后我们使用filter方法和axis参数过滤出’a’和’c’两行。
2. filter与布尔索引
虽然filter方法可以方便地过滤列或行,但是它不能用来过滤数据值。如果我们需要根据数据值来过滤数据,我们可以使用布尔索引。
布尔索引是一种高级索引技术,它允许我们根据条件来选择数据。在Pandas中,我们可以使用比较运算符(如<、>、==
等)来创建一个布尔DataFrame,然后使用这个布尔DataFrame来选择数据。
下面我们通过一些示例来说明如何使用布尔索引。
示例5:使用布尔索引过滤数据值
import pandas as pd
data = {
'Name': ['Tom', 'Nick', 'John', 'Tom'],
'Age': [20, 21, 19, 18],
'Email': ['tom@pandasdataframe.com', 'nick@pandasdataframe.com', 'john@pandasdataframe.com', 'tom@pandasdataframe.com']
}
df = pd.DataFrame(data)
filtered_df = df[df['Age'] > 19]
print(filtered_df)
Output:
在这个示例中,我们创建了一个布尔DataFrame,然后使用这个布尔DataFrame过滤出年龄大于19的行。
示例6:使用布尔索引过滤数据值
import pandas as pd
data = {
'Name': ['Tom', 'Nick', 'John', 'Tom'],
'Age': [20, 21, 19, 18],
'Email': ['tom@pandasdataframe.com', 'nick@pandasdataframe.com', 'john@pandasdataframe.com', 'tom@pandasdataframe.com']
}
df = pd.DataFrame(data)
filtered_df = df[df['Email'].str.contains('pandasdataframe.com')]
print(filtered_df)
Output:
在这个示例中,我们使用str.contains方法创建了一个布尔DataFrame,然后使用这个布尔DataFrame过滤出Email包含’pandasdataframe.com’的行。
3. filter与query方法
除了filter方法和布尔索引,Pandas还提供了一个query方法,它允许我们使用字符串表达式来过滤数据。query方法的基本语法如下:
DataFrame.query(expr, inplace=False)
参数说明:
- expr:一个字符串表达式,用来过滤数据。
- inplace:一个布尔值,如果为True,则在原地修改DataFrame,否则返回一个新的DataFrame。
下面我们通过一些示例来说明如何使用query方法。
示例7:使用query方法过滤数据值
import pandas as pd
data = {
'Name': ['Tom', 'Nick', 'John', 'Tom'],
'Age': [20, 21, 19, 18],
'Email': ['tom@pandasdataframe.com', 'nick@pandasdataframe.com', 'john@pandasdataframe.com', 'tom@pandasdataframe.com']
}
df = pd.DataFrame(data)
filtered_df = df.query('Age > 19')
print(filtered_df)
Output:
在这个示例中,我们使用query方法过滤出年龄大于19的行。
示例8:使用query方法过滤数据值
import pandas as pd
data = {
'Name': ['Tom', 'Nick', 'John', 'Tom'],
'Age': [20, 21, 19, 18],
'Email': ['tom@pandasdataframe.com', 'nick@pandasdataframe.com', 'john@pandasdataframe.com', 'tom@pandasdataframe.com']
}
df = pd.DataFrame(data)
filtered_df = df.query('Email.str.contains("pandasdataframe.com")', engine='python')
print(filtered_df)
Output:
在这个示例中,我们使用query方法和str.contains方法过滤出Email包含’pandasdataframe.com’的行。注意,这里我们需要指定engine参数为’python’,因为默认的engine不支持str.contains方法。
4. filter与loc、iloc方法
Pandas还提供了loc和iloc方法,它们允许我们通过标签或位置来过滤数据。loc方法使用标签来过滤数据,而iloc方法使用位置来过滤数据。
下面我们通过一些示例来说明如何使用loc和iloc方法。
示例9:使用loc方法过滤数据
import pandas as pd
data = {
'Name': ['Tom', 'Nick', 'John', 'Tom'],
'Age': [20, 21, 19, 18],
'Email': ['tom@pandasdataframe.com', 'nick@pandasdataframe.com', 'john@pandasdataframe.com', 'tom@pandasdataframe.com']
}
df = pd.DataFrame(data, index=['a', 'b', 'c', 'd'])
filtered_df = df.loc[['a', 'c']]
print(filtered_df)
Output:
在这个示例中,我们使用loc方法过滤出’a’和’c’两行。
示例10:使用iloc方法过滤数据
import pandas as pd
data = {
'Name': ['Tom', 'Nick', 'John', 'Tom'],
'Age': [20, 21, 19, 18],
'Email': ['tom@pandasdataframe.com', 'nick@pandasdataframe.com', 'john@pandasdataframe.com', 'tom@pandasdataframe.com']
}
df = pd.DataFrame(data)
filtered_df = df.iloc[[0, 2]]
print(filtered_df)
Output:
在这个示例中,我们使用iloc方法过滤出第0行和第2行。
5. filter与where、mask方法
Pandas还提供了where和mask方法,它们允许我们根据条件来过滤数据。where方法保留满足条件的数据,而mask方法保留不满足条件的数据。
下面我们通过一些示例来说明如何使用where和mask方法。
示例11:使用where方法过滤数据
import pandas as pd
data = {
'Name': ['Tom', 'Nick', 'John', 'Tom'],
'Age': [20, 21, 19, 18],
'Email': ['tom@pandasdataframe.com', 'nick@pandasdataframe.com', 'john@pandasdataframe.com', 'tom@pandasdataframe.com']
}
df = pd.DataFrame(data)
filtered_df = df.where(df['Age'] > 19)
print(filtered_df)
Output:
在这个示例中,我们使用where方法过滤出年龄大于19的行。注意,不满足条件的行将被替换为NaN。
示例12:使用mask方法过滤数据
import pandas as pd
data = {
'Name': ['Tom', 'Nick', 'John', 'Tom'],
'Age': [20, 21, 19, 18],
'Email': ['tom@pandasdataframe.com', 'nick@pandasdataframe.com', 'john@pandasdataframe.com', 'tom@pandasdataframe.com']
}
df = pd.DataFrame(data)
filtered_df = df.mask(df['Age'] > 19)
print(filtered_df)
Output:
在这个示例中,我们使用mask方法过滤出年龄不大于19的行。注意,满足条件的行将被替换为NaN。
6. filter与isin方法
Pandas还提供了一个isin方法,它允许我们过滤出包含在给定列表中的数据。
下面我们通过一些示例来说明如何使用isin方法。
示例13:使用isin方法过滤数据
import pandas as pd
data = {
'Name': ['Tom', 'Nick', 'John', 'Tom'],
'Age': [20, 21, 19, 18],
'Email': ['tom@pandasdataframe.com', 'nick@pandasdataframe.com', 'john@pandasdataframe.com', 'tom@pandasdataframe.com']
}
df = pd.DataFrame(data)
filtered_df = df[df['Name'].isin(['Tom', 'John'])]
print(filtered_df)
Output:
在这个示例中,我们使用isin方法过滤出名字为’Tom’或’John’的行。
7. filter与between方法
Pandas还提供了一个between方法,它允许我们过滤出在给定范围内的数据。
下面我们通过一些示例来说明如何使用between方法。
示例14:使用between方法过滤数据
import pandas as pd
data = {
'Name': ['Tom', 'Nick', 'John', 'Tom'],
'Age': [20, 21, 19, 18],
'Email': ['tom@pandasdataframe.com', 'nick@pandasdataframe.com', 'john@pandasdataframe.com', 'tom@pandasdataframe.com']
}
df = pd.DataFrame(data)
filtered_df = df[df['Age'].between(19, 21)]
print(filtered_df)
Output:
在这个示例中,我们使用between方法过滤出年龄在19到21之间的行。
8. filter与duplicated方法
Pandas还提供了一个duplicated方法,它允许我们过滤出重复的数据。
下面我们通过一些示例来说明如何使用duplicated方法。
示例15:使用duplicated方法过滤数据
import pandas as pd
data = {
'Name': ['Tom', 'Nick', 'John', 'Tom'],
'Age': [20, 21, 19, 18],
'Email': ['tom@pandasdataframe.com', 'nick@pandasdataframe.com', 'john@pandasdataframe.com', 'tom@pandasdataframe.com']
}
df = pd.DataFrame(data)
filtered_df = df[df.duplicated('Name', keep=False)]
print(filtered_df)
Output:
在这个示例中,我们使用duplicated方法过滤出名字重复的行。
9. filter与drop_duplicates方法
Pandas还提供了一个drop_duplicates方法,它允许我们删除重复的数据。
下面我们通过一些示例来说明如何使用drop_duplicates方法。
示例16:使用drop_duplicates方法过滤数据
import pandas as pd
data = {
'Name': ['Tom', 'Nick', 'John', 'Tom'],
'Age': [20, 21, 19, 18],
'Email': ['tom@pandasdataframe.com', 'nick@pandasdataframe.com', 'john@pandasdataframe.com', 'tom@pandasdataframe.com']
}
df = pd.DataFrame(data)
filtered_df = df.drop_duplicates('Name', keep='first')
print(filtered_df)
Output:
在这个示例中,我们使用drop_duplicates方法删除名字重复的行,只保留每个名字的第一行。
10. filter与eval方法
Pandas还提供了一个eval方法,它允许我们使用字符串表达式来过滤数据。eval方法的基本语法如下:
DataFrame.eval(expr, inplace=False)
参数说明:
- expr:一个字符串表达式,用来过滤数据。
- inplace:一个布尔值,如果为True,则在原地修改DataFrame,否则返回一个新的DataFrame。
下面我们通过一些示例来说明如何使用eval方法。
示例17:使用eval方法过滤数据
import pandas as pd
data = {
'Name': ['Tom', 'Nick', 'John', 'Tom'],
'Age': [20, 21, 19, 18],
'Email': ['tom@pandasdataframe.com', 'nick@pandasdataframe.com', 'john@pandasdataframe.com', 'tom@pandasdataframe.com']
}
df = pd.DataFrame(data)
filtered_df = df.eval('Age > 19')
print(filtered_df)
Output:
在这个示例中,我们使用eval方法过滤出年龄大于19的行。注意,eval方法返回的是一个布尔序列,我们可以使用这个布尔序列来过滤DataFrame。
11. filter与query方法
Pandas还提供了一个query方法,它允许我们使用字符串表达式来过滤数据。query方法的基本语法如下:
DataFrame.query(expr, inplace=False)
参数说明:
- expr:一个字符串表达式,用来过滤数据。
- inplace:一个布尔值,如果为True,则在原地修改DataFrame,否则返回一个新的DataFrame。
下面我们通过一些示例来说明如何使用query方法。
示例18:使用query方法过滤数据
import pandas as pd
data = {
'Name': ['Tom', 'Nick', 'John', 'Tom'],
'Age': [20, 21, 19, 18],
'Email': ['tom@pandasdataframe.com', 'nick@pandasdataframe.com', 'john@pandasdataframe.com', 'tom@pandasdataframe.com']
}
df = pd.DataFrame(data)
filtered_df = df.query('Age > 19')
print(filtered_df)
Output:
在这个示例中,我们使用query方法过滤出年龄大于19的行。
12. 总结
在本文中,我们介绍了Pandas中的多种数据过滤方法,包括filter、loc、iloc、where、mask、isin、between、duplicated、drop_duplicates、eval和query方法。这些方法可以帮助我们根据不同的需求来过滤数据,从而进行更有效的数据分析和处理。