如何根据 Pandas 中的列值过滤 DataFrame 行
我们可以根据单列或多列值选择 DataFrame
的行。我们也可以从 DataFrame 中获得满足或不满足一个或多个条件的行。这可以通过布尔索引,位置索引,标签索引和 query()方法来实现。
根据特定的列值选择 Pandas 行
我们可以从包含或不包含列的特定值的 DataFrame 中选择 Pandas 行。它广泛用于根据列值过滤 DataFrame。
选择包含特定列值的 Pandas 行
在布尔索引中,我们首先生成一个掩码,该掩码只是表示该列是否包含特定元素的一系列布尔值。
df_mask = df["col_name"] == "specific_value"
然后,我们将此掩码应用于原始 DataFrame 以过滤所需的值。
filtered_df = df[df_mask]
这将返回过滤后的 DataFrame,该 DataFrame
仅包含具有 col_name
列的 specific_value
值的行。
import pandas as pd
dates = ["April-10", "April-11", "April-12", "April-13", "April-14", "April-16"]
sales = [200, 300, 400, 200, 300, 300]
prices = [3, 1, 2, 4, 3, 2]
df = pd.DataFrame({"Date": dates, "Sales": sales, "Price": prices})
df_mask = df["Sales"] == 300
filtered_df = df[df_mask]
print(filtered_df)
输出:
Date Sales Price
1 April-11 300 1
4 April-14 300 3
5 April-16 300 2
这将给出 df
中所有销售额为 300 的行。
它与布尔索引相似,但是要多做一步。在这种方法中,我们首先创建一个布尔掩码,然后找到布尔掩码具有真值的位置。然后,我们将掩码中所有值为 True
的位置传递给 iloc()
方法,以便仅选择所有需要的行。
import pandas as pd
import numpy as np
dates = ["April-10", "April-11", "April-12", "April-13", "April-14", "April-16"]
sales = [200, 300, 400, 200, 300, 300]
prices = [3, 1, 2, 4, 3, 2]
df = pd.DataFrame({"Date": dates, "Sales": sales, "Price": prices})
df_mask = df["Sales"] == 300
positions = np.flatnonzero(df_mask)
filtered_df = df.iloc[positions]
print(filtered_df)
输出:
Date Sales Price
1 April-11 300 1
4 April-14 300 3
5 April-16 300 2
这也会给出 df
中所有销售值是 300 的行。
我们还可以使用 Pandas Chaining 来按列值过滤 pandas.DataFrame
过滤器。在这种方法中,我们使用 pandas.DataFrame.eq() 方法,将检查其值以比较 DataFrame 中按元素的相等性。
import pandas as pd
import numpy as np
dates = ["April-10", "April-11", "April-12", "April-13", "April-14", "April-16"]
sales = [200, 300, 400, 200, 300, 300]
prices = [3, 1, 2, 4, 3, 2]
df = pd.DataFrame({"Date": dates, "Sales": sales, "Price": prices})
filtered_df = df[df.Sales.eq(300)]
print(filtered_df)
输出:
Date Sales Price
1 April-11 300 1
4 April-14 300 3
5 April-16 300 2
我们可以使用 pandas.DataFrame.query() 在列中按列值选择 Pandas 行。
import pandas as pd
import numpy as np
dates = ["April-10", "April-11", "April-12", "April-13", "April-14", "April-16"]
sales = [200, 300, 400, 200, 300, 300]
prices = [3, 1, 2, 4, 3, 2]
df = pd.DataFrame({"Date": dates, "Sales": sales, "Price": prices})
filtered_df = df.query("Sales == 300")
print(filtered_df)
输出:
Date Sales Price
1 April-11 300 1
4 April-14 300 3
5 April-16 300 2
如果我们希望更新现有的 DataFrame,可以在查询方法中设置 inplace=True
。
选择不包含特定列值的 Pandas 行
选择不包含特定列值的 Pandas 行的方法与选择具有特定列值的 Pandas 行的方法类似。我们唯一需要更改的是条件,即在创建掩码或查询时,仅将 ==
替换为!=
即可使该列不包含特定值。
import pandas as pd
dates = ["April-10", "April-11", "April-12", "April-13", "April-14", "April-16"]
sales = [200, 300, 400, 200, 300, 300]
prices = [3, 1, 2, 4, 3, 2]
df = pd.DataFrame({"Date": dates, "Sales": sales, "Price": prices})
df_mask = df["Sales"] != 300
filtered_df = df[df_mask]
print(filtered_df)
输出:
Date Sales Price
0 April-10 200 3
2 April-12 400 2
3 April-13 200 4
这将选择销售值不是 300
的所有 df
行。
选择列值大于或小于特定值的 Pandas 行
要选择列值大于或小于特定值的 Pandas 行,在创建遮罩或查询时,请使用诸如 >
,<=
,>=
之类的运算符。
import pandas as pd
dates = ["April-10", "April-11", "April-12", "April-13", "April-14", "April-16"]
sales = [200, 300, 400, 200, 300, 300]
prices = [3, 1, 2, 4, 3, 2]
df = pd.DataFrame({"Date": dates, "Sales": sales, "Price": prices})
df_mask = df["Sales"] >= 300
filtered_df = df[df_mask]
print(filtered_df)
输出:
Date Sales Price
1 April-11 300 1
2 April-12 400 2
4 April-14 300 3
5 April-16 300 2
这将导致 DataFrame 的 Sales
值大于或等于 300
。
根据多个列值选择 Pandas 行
我们介绍了根据 DataFrame 中列的特定值选择行的方法。在本节中,我们将讨论基于多个列值选择 Pandas 行的方法。
选择包含多个列值之一的 Pandas 行
要选择包含多个列值之一的 Pandas 行,我们使用 pandas.DataFrame.isin(values),该方法返回布尔值的 DataFrame,该布尔值表示 DataFrame 中的每个元素是否包含在值中。这样获得的布尔值的 DataFrame 可用于选择行。
import pandas as pd
dates = ["April-10", "April-11", "April-12", "April-13", "April-14", "April-16"]
sales = [200, 300, 400, 200, 300, 300]
prices = [3, 1, 2, 4, 3, 2]
df = pd.DataFrame({"Date": dates, "Sales": sales, "Price": prices})
values = [200, 400]
filtered_df = df[df.Sales.isin(values)]
print(filtered_df)
输出:
Date Sales Price
0 April-10 200 3
2 April-12 400 2
3 April-13 200 4
它将 DataFrame 的 Sales
值为 200
或 400
的所有行中过滤掉。
选择不包含多个指定列值之一的 Pandas 行
要选择不包含多个指定列值中任何一个的 DataFrame 的行,我们将通过在前面放置~
符号来将从 pandas.DataFrame.isin(values) 返回的 booleans
的 DataFrame
取反。
import pandas as pd
dates = ["April-10", "April-11", "April-12", "April-13", "April-14", "April-16"]
sales = [200, 300, 400, 200, 300, 300]
prices = [3, 1, 2, 4, 3, 2]
df = pd.DataFrame({"Date": dates, "Sales": sales, "Price": prices})
values = [200, 400]
filtered_df = df[~df.Sales.isin(values)]
print(filtered_df)
输出:
Date Sales Price
1 April-11 300 1
4 April-14 300 3
5 April-16 300 2
它从 DataFrame 中过滤所有销售额值既不是 200 也不是 400 的行。
选择具有多个条件的 DataFrame 行
如果我们要考虑多列的行值来过滤行,则要创建多个条件,并将它们与 &
运算符组合。现在,仅当满足所有列的条件时才选择该行。
import pandas as pd
dates = ["April-10", "April-11", "April-12", "April-13", "April-14", "April-16"]
sales = [200, 300, 400, 200, 300, 300]
prices = [3, 1, 2, 4, 3, 2]
df = pd.DataFrame({"Date": dates, "Sales": sales, "Price": prices})
values_1 = [200, 400]
values_2 = [2, 3]
filtered_df = df[df.Sales.isin(values_1) & ~df.Price.isin(values_2)]
print(filtered_df)
输出:
Date Sales Price
3 April-13 200 4
它从销售值为 200
或 400
且价格为 2
或 3
的 DataFrame 中过滤所有行。输出中的行仅满足整个 DataFrame 中的两个条件。
相关文章
Pandas 中的 Join 和 Merge 有什么区别
发布时间:2024/04/20 浏览次数:59 分类:Python
-
本文将为我们介绍 pandas 中 join 和 merge 方法之间的区别。
Pandas 以表格样式显示 DataFrame
发布时间:2024/04/20 浏览次数:155 分类:Python
-
本教程演示了如何通过使用不同的方法(例如,使用显示函数、制表库和使用 dataframe.style)以表格样式显示 Pandas DataFrame。
Pandas 和 Seaborn 的 KDE 绘图可视化
发布时间:2024/04/20 浏览次数:191 分类:Python
-
本文演示了如何将 KDE 绘图可视化与 Pandas 和 Seaborn 一起使用。
Pandas DataFrame 中浅拷贝与深拷贝的区别
发布时间:2024/04/20 浏览次数:81 分类:Python
-
本教程介绍如何使用 Pandas DataFrame 来识别浅拷贝和深拷贝之间的区别。
Pandas DataFrame 尺寸
发布时间:2024/04/20 浏览次数:83 分类:Python
-
本教程解释了 python pandas 属性(例如 df.size、df.shape 和 df.ndim)的工作原理。
Pandas 中如何获取特定列满足给定条件的所有行的索引
发布时间:2024/04/20 浏览次数:71 分类:Python
-
我们可以使用简单的索引操作,np.where()函数和 query()方法来获取特定列满足给定条件的所有行的索引。