熊猫优惠洛克财产,一种基于标签的数据选择方法,允许您根据多个条件选择数据。
本教程旨在指导您在多种条件下使用 Pandas loc 函数。
了解多个条件的逻辑运算符
Python 中的逻辑运算符,例如“and”、“or”和“not”,允许组合简单的条件以形成复杂的条件语句。
逻辑运算符
- ‘and’:如果两个条件都为真,则返回 True
- ‘or’:如果至少一个条件为真,则返回 True
- ‘not’:如果条件为真则返回 False(反转条件)
这是一个快速浏览:
print(True and False)
print(True or False)
print(not True)
Output:
False
True
False
在上面的代码中,“and”运算符返回 False,因为两个条件(True 和 False)都不为 True。
“or”运算符返回 True,因为至少有一个条件(True 或 False)为 True。
最后,“not”运算符返回 False,因为条件为 True,而“not”则反转条件。
使用 AND 运算符 (&) 组合条件
现在让我们深入研究使用 AND 运算符组合条件,如下所示&
在熊猫中。
我们将从一个简单的 DataFrame 示例开始:
import pandas as pd
data = {'Name': ['Tom', 'Nick', 'John', 'Tom'], 'Age': [20, 21, 19, 18], 'Grade': ['A', 'B', 'A', 'C']}
df = pd.DataFrame(data)
print(df)
Output:
Name Age Grade
0 Tom 20 A
1 Nick 21 B
2 John 19 A
3 Tom 18 C
在此数据框中,我们有“姓名”、“年龄”和“年级”作为列。
现在,假设您的任务是获取“年龄”> 19 且“年级”=“A”的行。操作方法如下:
print(df.loc[(df['Age'] > 19) & (df['Grade'] == 'A')])
Output:
Name Age Grade
0 Tom 20 A
使用loc
函数和“与”运算符 (&),代码会获取满足两个条件的行:“年龄”> 19 且“年级”等于“A”。
使用 OR 运算符 (|) 组合条件
再次参考我们之前的 DataFrame,这次让我们获取“Age”> 19 或“Grade”=“A”的行。
print(df.loc[(df['Age'] > 19) | (df['Grade'] == 'A')])
Output:
Name Age Grade
0 Tom 20 A
1 Nick 21 B
2 John 19 A
在上面的代码中,我们使用了loc
带有 OR 运算符的函数 (|
)。这将返回至少满足以下条件之一的行:“年龄”> 19 或“年级”等于“A”。
使用带有 NOT 运算符 (~) 的多个条件
NOT 运算符表示为~
在熊猫中。如果您想获得条件的相反结果,NOT 运算符非常有用。
坚持之前的 DataFrame,让我们获取“Grade”不是“A”的行。
print(df.loc[~(df['Grade'] == 'A')])
Output:
Name Age Grade
1 Nick 21 B
3 Tom 18 C
这段代码使用了loc
带有 NOT 运算符的函数 (~
) 返回“Grade”不是“A”的行。如您所见,第 0 行和第 2 行被排除在输出中,因为它们的“Grade”等于“A”。
组合两个以上的条件
让我们使用之前的 DataFrame 并获取“Age”大于 19、“Grade”为“A”、“Name”为“Tom”的行。
print(df.loc[(df['Age'] > 19) & (df['Grade'] == 'A') & (df['Name'] == 'Tom')])
Output:
Name Age Grade
0 Tom 20 A
在上面的代码中,我们扩展了条件loc
函数使用三个条件而不是两个。
特定列的多个条件
让我们看看如何使用 Pandas 选择具有多个条件的特定列loc
.
我们从前面的例子中获取数据:
print(df.loc[(df['Grade'] == 'A') & (df['Age'] > 19), 'Name'])
Output:
0 Tom
Name: Name, dtype: object
在代码片段中,我们使用了loc
选择“Grade”等于“A”且“Age”大于 19 的所有行。
此外,通过附加'Name'
在结束时loc
函数时,它仅从满足条件的行中选择“名称”列。
选择具有多个条件的多列
让我们看看如何选择具有多个条件的多列loc
.
print(df.loc[(df['Age'] > 19), ['Name', 'Grade']])
Output:
Name Grade
0 Tom A
1 Nick B
在上面的代码中,我们使用“loc”来选择“Age”大于 19 的所有行。
此外,通过添加列表,['Name', 'Grade']
,它仅从满足条件的行中选择“Name”和“Grade”列。
使用 loc 和多个条件处理空值
为了给您一个说明,让我们修改 DataFrame 以包含 null 值:
import numpy as np
data = {'Name': ['Tom', 'Nick', 'John', 'Tom'], 'Age': [20, 21, 19, np.nan], 'Grade': ['A', 'B', 'A', 'C']}
df = pd.DataFrame(data)
print(df)
Output:
Name Age Grade
0 Tom 20.0 A
1 Nick 21.0 B
2 John 19.0 A
3 Tom NaN C
在这里,您会看到最后一个条目(“Tom”)的“Age”是 NaN(不是数字),表示空值或缺失值。
现在,让我们获取“Age”不为空且“Grade”等于“A”的行。
print(df.loc[(df['Grade'] == 'A') & (df['Age'].notna())])
Output:
Name Age Grade
0 Tom 20.0 A
2 John 19.0 A
这段代码使用了notna()
函数结合loc
和逻辑 AND 仅选择“Grade”为“A”且“Age”不为空的行。
将 loc 与日期/时间数据的多个条件结合使用
让我们从一个简单的 DataFrame 开始,其中日期/时间作为其中一列。
data = {'Date': pd.date_range(start='1/1/2020', end='1/10/2020'), 'Value': range(10)}
df = pd.DataFrame(data)
print(df)
Output:
Date Value
0 2020-01-01 0
1 2020-01-02 1
2 2020-01-03 2
3 2020-01-04 3
4 2020-01-05 4
5 2020-01-06 5
6 2020-01-07 6
7 2020-01-08 7
8 2020-01-09 8
9 2020-01-10 9
要选择“日期”晚于 2020 年 1 月 3 日且“值”大于 5 的所有行,可以使用以下代码:
print(df.loc[(df['Date'] > '2020-01-03') & (df['Value'] > 5)])
Output:
Date Value
6 2020-01-07 6
7 2020-01-08 7
8 2020-01-09 8
9 2020-01-10 9
The loc
函数与逻辑 AND 运算符相结合,过滤 DataFrame 中“日期”在“2020-01-03”之后且“值”大于 5 的行。
将 loc 与数值数据的多个条件结合使用
让我们考虑一个简单的 DataFrame,其中有数值数据。
data = {'Column1': [15, 20, 35, 40, 55], 'Column2': [100, 200, 300, 400, 500]}
df = pd.DataFrame(data)
print(df)
Output:
Column1 Column2
0 15 100
1 20 200
2 35 300
3 40 400
4 55 500
要选择“Column1”大于 20 且“Column2”小于 500 的行,可以使用以下代码:
print(df.loc[(df['Column1'] > 20) & (df['Column2'] < 500)])
Output:
Column1 Column2
2 35 300
3 40 400
The loc
该函数使用逻辑 AND 运算符 (&),过滤 DataFrame 中“Column1”大于 20 且“Column2”小于 500 的行。
将 loc 与多个条件结合使用用于分类数据
考虑这个数据框:
data = {'Name': ['Tom', 'Nick', 'John', 'Tom'], 'Color': ['Blue', 'Green', 'Red', 'Blue'], 'Number': [1, 2, 3, 4]}
df = pd.DataFrame(data)
print(df)
Output:
Name Color Number
0 Tom Blue 1
1 Nick Green 2
2 John Red 3
3 Tom Blue 4
让我们显示“颜色”为“蓝色”且“数字”大于 1 的行。
print(df.loc[(df['Color'] == 'Blue') & (df['Number'] > 1)])
Output:
Name Color Number
3 Tom Blue 4
在上面的代码中,loc
与 AND 运算符相结合,过滤 DataFrame 中“颜色”为“蓝色”且“数字”大于 1 的行。
根据多种条件更新DataFrame
让我们回到我们的 DataFrame:
data = {'Name': ['Tom', 'Nick', 'John', 'Tom'], 'Age': [20, 21, 19, 18], 'Grade': ['A', 'B', 'A', 'C']}
df = pd.DataFrame(data)
print(df)
Output:
Name Age Grade
0 Tom 20 A
1 Nick 21 B
2 John 19 A
3 Tom 18 C
假设您想要将“年龄”> 19 岁的学生的“等级”从“B”更改为“A”。具体操作方法如下:
df.loc[(df['Age'] > 19) & (df['Grade'] == 'B'), 'Grade'] = 'A'
print(df)
Output:
Name Age Grade
0 Tom 20 A
1 Nick 21 A
2 John 19 A
3 Tom 18 C
在上面的代码中,loc
选择了“年龄”> 19 且“年级”为“B”的行。然后它将“等级”更新为“A”。
现实世界的例子
回到我在埃及电信公司的日子,分析大型数据集是我工作的常规部分。
我们从众多客户那里收集了数百万个数据点,包括他们的通话记录、数据使用情况、充值模式和投诉日志。
有一次,我的任务是识别在过去六个月内使用超过 5GB 数据、拨打超过 1000 分钟通话以及至少收到 3 起投诉的用户。
通过使用熊猫loc
有了多个条件,上面提到的任务就变成了几行代码的问题!
target_subscribers = df.loc[(df['Data Usage'] > 5) & (df['Call Minutes'] > 1000) & (df['Complaints'] >= 3)]
当网络团队需要探索不同的阈值来识别潜在的服务改进领域时,这非常有用。
总而言之,使用 Pandasloc
事实证明,具有多个条件的数据在许多数据分析操作中非常有价值,它允许您以多种高效的方式过滤、选择或更改数据。