答案:Pandas中选择数据的核心方法是loc、iloc和布尔索引。loc基于标签进行索引,支持切片包含结束点,适合使用行索引和列名操作;iloc基于整数位置,切片行为与Python列表一致,适用于按位置访问数据;布尔索引通过条件筛选行,可结合逻辑运算符实现复杂查询。优先使用loc保证代码可读性,按位置操作时用iloc,避免链式索引以防止SettingWithCopyWarning,复杂条件可用query()提升可读性,单值访问推荐at和iat提高效率。

在Pandas中,要从DataFrame中选择特定的行和列,核心方法主要有三种:基于标签的
loc
iloc
Pandas DataFrame的数据索引与切片,就像你在地图上找具体位置一样,需要明确的坐标。我们通常会用到
loc
iloc
1. 使用 loc
loc
df.loc[row_label, column_label]
立即学习“Python免费学习笔记(深入)”;
选择单行或单列:
import pandas as pd
import numpy as np
# 创建一个示例DataFrame
data = {'A': [1, 2, 3, 4],
'B': [5, 6, 7, 8],
'C': [9, 10, 11, 12]}
df = pd.DataFrame(data, index=['x', 'y', 'z', 'w'])
print("原始DataFrame:\n", df)
# 选择索引为'y'的行
print("\n选择索引为'y'的行:\n", df.loc['y'])
# 选择列'B'
print("\n选择列'B':\n", df.loc[:, 'B'])选择多行或多列: 可以传入一个列表。
# 选择索引为'x'和'z'的行 print("\n选择索引为'x'和'z'的行:\n", df.loc[['x', 'z']]) # 选择列'A'和'C' print("\n选择列'A'和'C':\n", df.loc[:, ['A', 'C']])
选择行和列的组合:
# 选择索引为'y'和'w'的行的列'A'和'C' print("\n选择索引为'y','w'的行的列'A','C':\n", df.loc[['y', 'w'], ['A', 'C']]) # 选择从索引'y'到'w'(包含)的所有行,以及从列'A'到'C'(包含)的所有列 # 注意:loc的切片是包含结束点的 print("\n切片选择行'y'到'w',列'A'到'C':\n", df.loc['y':'w', 'A':'C'])
2. 使用 iloc
iloc
df.iloc[row_index, column_index]
选择单行或单列:
# 选择第1行(索引为0开始) print("\n选择第1行:\n", df.iloc[0]) # 选择第2列(索引为0开始) print("\n选择第2列:\n", df.iloc[:, 1])
选择多行或多列: 同样可以传入一个列表。
# 选择第0和第2行 print("\n选择第0和第2行:\n", df.iloc[[0, 2]]) # 选择第0和第2列 print("\n选择第0和第2列:\n", df.iloc[:, [0, 2]])
选择行和列的组合:
# 选择第1和第3行的第0和第2列 print("\n选择第1和第3行的第0和第2列:\n", df.iloc[[1, 3], [0, 2]]) # 切片选择从第1行到第3行(不包含第3行),以及从第0列到第2列(不包含第2列) # 注意:iloc的切片是排他性的,与Python列表切片行为一致 print("\n切片选择行1到3(不含3),列0到2(不含2):\n", df.iloc[1:3, 0:2])
3. 使用布尔索引进行条件筛选
布尔索引是我在进行数据清洗和分析时最常用的功能之一,它允许你根据一个或多个条件来选择行。
单条件筛选:
# 选择列'A'中值大于2的所有行 print("\n选择列'A'中值大于2的所有行:\n", df[df['A'] > 2])
多条件筛选: 使用
&
|
~
# 选择列'A'大于2且列'B'小于8的所有行
print("\n选择列'A'>2且'B'<8的所有行:\n", df[(df['A'] > 2) &amp; (df['B'] < 8)])
# 选择列'A'等于1或列'C'大于11的所有行
print("\n选择列'A'==1或'C'>11的所有行:\n", df[(df['A'] == 1) | (df['C'] > 11)])
# 选择列'A'不等于1的所有行
print("\n选择列'A'不等于1的所有行:\n", df[~(df['A'] == 1)])结合 loc
# 选择列'A'大于2的所有行的列'B'和'C' print(&quot;\n选择列'A'>2的所有行的列'B'和'C':\n&quot;, df.loc[df['A'] > 2, ['B', 'C']])
loc
iloc
这确实是初学者,甚至是一些有经验的用户也时常会混淆的地方。说实话,刚开始用的时候我也常常搞不清楚什么时候该用哪个。但核心的区别其实非常简单:
loc
iloc
想象一下你有一本书,
loc
iloc
loc
loc
df.loc['start_label':'end_label']
end_label
loc
iloc
df.iloc[0:5]
iloc
我该如何选择?
我的建议是:
loc
loc
iloc
一个常见的错误就是把
loc
iloc
loc
iloc
布尔索引是Pandas数据筛选的利器,它允许你根据数据的实际值来动态选择行,这在数据分析和清洗中几乎是无处不在的。
利用布尔索引进行复杂筛选:
多条件组合: 如前面所示,使用
&amp;
|
~
# 假设df有一个'Age'和'Gender'列 # df[(df['Age'] >= 18) &amp; (df['Age'] <= 30) &amp; (df['Gender'] == 'Female')]
这里的关键是每个独立的条件表达式都必须用括号
()
&amp;
|
>
<
==
使用 isin()
isin()
# 选择列'City'是'New York'或'London'的行 # df[df['City'].isin(['New York', 'London'])]
这比写
(df['City'] == 'New York') | (df['City'] == 'London')
使用 str.contains()
str.contains()
# 选择列'Description'中包含'error'关键词的行
# df[df['Description'].str.contains('error', na=False)]na=False
True
常见陷阱:
忘记括号: 这是最常见的错误,没有之一。
# 错误示例: # df[df['A'] > 2 &amp; df['B'] < 8] # 这会先计算 2 &amp; df['B'],然后用 df['A'] > (结果) # 正确写法: # df[(df['A'] > 2) &amp; (df['B'] < 8)]
Pandas会告诉你一个
ValueError: The truth value of a Series is ambiguous
处理 NaN
NaN
NaN
False
# 假设df有一个包含NaN的'Value'列 # df[df['Value'] > 10] # 结果会排除所有NaN的行,即使你可能希望它们被包含在内或单独处理。
处理
NaN
dropna()
NaN
fillna()
NaN
isna()
notna()
NaN
# 选择'Value'列不是NaN的行 # df[df['Value'].notna()]
对Series进行布尔运算时,Series的索引必须对齐。 如果你创建了一个布尔Series,它的索引与DataFrame的索引不匹配,Pandas会尝试对齐,如果对齐失败(例如,索引标签不完全一致),可能会填充
NaN
布尔索引的强大之处在于它的灵活性,但这种灵活性也要求我们对数据类型和运算符优先级有清晰的认识。我通常会把复杂的条件分解成小的、可测试的部分,确保每个布尔Series都按预期生成,然后再组合起来。
在掌握了
loc
iloc
避免链式索引 (Chained Indexing) 写入操作,警惕 SettingWithCopyWarning
# df[df['col_A'] > 5]['col_B'] = 10 # 错误或产生警告
你可能会遇到
SettingWithCopyWarning
df[df['col_A'] > 5]
正确且推荐的做法是使用 loc
iloc
# 修改满足条件的行的特定列 df.loc[df['col_A'] > 5, 'col_B'] = 10
这种方式明确地告诉Pandas,你打算在原始DataFrame上进行修改,它会返回一个指向原始数据的引用,确保修改生效。
使用 query()
query()
# 假设df有'Age', 'Gender', 'Score'列
# df.query('Age > 25 and Gender == "Male" and Score > 80')query()
@
min_age = 25
# df.query('Age > @min_age')使用 filter()
filter()
# 选择列名中包含'A'的列 # df.filter(like='A') # 选择列名以'C'开头的列 # df.filter(regex='^C') # 选择特定列(与df[['col1', 'col2']]类似,但更灵活) # df.filter(items=['col1', 'col2'])
这在处理大量列或者需要动态选择列时非常方便。
at
iat
at
iat
loc
iloc
# 获取索引为'y',列为'A'的值 # value = df.at['y', 'A'] # 修改索引为'z',列为'C'的值 # df.at['z', 'C'] = 100 # 获取第1行,第0列的值 # value = df.iat[1, 0]
虽然这看起来是微小的优化,但在大型数据集上进行大量单点操作时,累积起来的性能提升会很显著。
这些高级技巧并非每次数据选择都必须使用,但它们提供了更高效、更具可读性或更安全的选择。在实际工作中,我通常会根据具体场景和数据规模来决定使用哪种方法。例如,对于简单的筛选,直接布尔索引就足够了;但如果条件复杂或者需要避免
SettingWithCopyWarning
loc
query()
以上就是Python怎么从pandas DataFrame中选择特定的行和列_pandas数据索引与切片技巧的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号