Python怎么从pandas DataFrame中选择特定的行和列_pandas数据索引与切片技巧

冰火之心
发布: 2025-09-14 08:32:01
原创
598人浏览过
<blockquote>答案:Pandas中选择数据的核心方法是loc、iloc和布尔索引。loc基于标签进行索引,支持切片包含结束点,适合使用行索引和列名操作;iloc基于整数位置,切片行为与Python列表一致,适用于按位置访问数据;布尔索引通过条件筛选行,可结合逻辑运算符实现复杂查询。优先使用loc保证代码可读性,按位置操作时用iloc,避免链式索引以防止SettingWithCopyWarning,复杂条件可用query()提升可读性,单值访问推荐at和iat提高效率。</blockquote> <p><img src="https://img.php.cn/upload/article/001/431/639/175780992221290.png" alt="python怎么从pandas dataframe中选择特定的行和列_pandas数据索引与切片技巧"></p> <p>在Pandas中,要从DataFrame中选择特定的行和列,核心方法主要有三种:基于标签的<div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false;">loc</pre>
登录后复制
</div>、基于整数位置的<div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false;">iloc</pre>
登录后复制
</div>,以及非常灵活的布尔索引。理解并熟练运用它们,能让你在数据处理时事半功倍,避免许多不必要的麻烦。</p> <h3>解决方案</h3> <p>Pandas DataFrame的数据索引与切片,就像你在地图上找具体位置一样,需要明确的坐标。我们通常会用到<div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false;">loc</pre>
登录后复制
</div>、<div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false;">iloc</pre>
登录后复制
</div>和布尔索引这三把“瑞士军刀”。</p> <p><strong>1. 使用 <div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false;">loc</pre>
登录后复制
</div> 进行基于标签的索引和切片</strong></p> <p><div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false;">loc</pre>
登录后复制
</div> 是我个人最常用也最推荐的方法之一,因为它直接使用行索引(index)和列名(column names)来定位数据,非常直观。它的基本语法是 <div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false;">df.loc[row_label, column_label]</pre>
登录后复制
</div>。</p> <p><span>立即学习</span>“<a href="https://pan.quark.cn/s/00968c3c2c15" style="text-decoration: underline !important; color: blue; font-weight: bolder;" rel="nofollow" target="_blank">Python免费学习笔记(深入)</a>”;</p> <ul> <li> <p><strong>选择单行或单列:</strong></p><div class="code" style="position:relative; padding:0px; margin:0px;"><pre class='brush:python;toolbar:false;'>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(&amp;amp;quot;原始DataFrame:\n&amp;amp;quot;, df) # 选择索引为'y'的行 print(&amp;amp;quot;\n选择索引为'y'的行:\n&amp;amp;quot;, df.loc['y']) # 选择列'B' print(&amp;amp;quot;\n选择列'B':\n&amp;amp;quot;, df.loc[:, 'B'])</pre>
登录后复制
</div></li> <li> <p><strong>选择多行或多列:</strong> 可以传入一个列表。</p><div class="code" style="position:relative; padding:0px; margin:0px;"><pre class='brush:python;toolbar:false;'># 选择索引为'x'和'z'的行 print(&amp;amp;quot;\n选择索引为'x'和'z'的行:\n&amp;amp;quot;, df.loc[['x', 'z']]) # 选择列'A'和'C' print(&amp;amp;quot;\n选择列'A'和'C':\n&amp;amp;quot;, df.loc[:, ['A', 'C']])</pre>
登录后复制
</div></li> <li> <p><strong>选择行和列的组合:</strong></p><div class="code" style="position:relative; padding:0px; margin:0px;"><pre class='brush:python;toolbar:false;'># 选择索引为'y'和'w'的行的列'A'和'C' print(&amp;amp;quot;\n选择索引为'y','w'的行的列'A','C':\n&amp;amp;quot;, df.loc[['y', 'w'], ['A', 'C']]) # 选择从索引'y'到'w'(包含)的所有行,以及从列'A'到'C'(包含)的所有列 # 注意:loc的切片是包含结束点的 print(&amp;amp;quot;\n切片选择行'y'到'w',列'A'到'C':\n&amp;amp;quot;, df.loc['y':'w', 'A':'C'])</pre>
登录后复制
</div></li> </ul> <p><strong>2. 使用 <div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false;">iloc</pre>
登录后复制
</div> 进行基于整数位置的索引和切片</strong></p> <p><div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false;">iloc</pre>
登录后复制
</div> 则完全依赖于数据的整数位置,就像Python列表的索引一样。它的基本语法是 <div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false;">df.iloc[row_index, column_index]</pre>
登录后复制
</div>。</p> <ul> <li> <p><strong>选择单行或单列:</strong></p><div class="code" style="position:relative; padding:0px; margin:0px;"><pre class='brush:python;toolbar:false;'># 选择第1行(索引为0开始) print(&amp;amp;quot;\n选择第1行:\n&amp;amp;quot;, df.iloc[0]) # 选择第2列(索引为0开始) print(&amp;amp;quot;\n选择第2列:\n&amp;amp;quot;, df.iloc[:, 1])</pre>
登录后复制
</div></li> <li> <p><strong>选择多行或多列:</strong> 同样可以传入一个列表。</p><div class="code" style="position:relative; padding:0px; margin:0px;"><pre class='brush:python;toolbar:false;'># 选择第0和第2行 print(&amp;amp;quot;\n选择第0和第2行:\n&amp;amp;quot;, df.iloc[[0, 2]]) # 选择第0和第2列 print(&amp;amp;quot;\n选择第0和第2列:\n&amp;amp;quot;, df.iloc[:, [0, 2]])</pre>
登录后复制
</div></li> <li> <p><strong>选择行和列的组合:</strong></p><div class="code" style="position:relative; padding:0px; margin:0px;"><pre class='brush:python;toolbar:false;'># 选择第1和第3行的第0和第2列 print(&amp;amp;quot;\n选择第1和第3行的第0和第2列:\n&amp;amp;quot;, df.iloc[[1, 3], [0, 2]]) # 切片选择从第1行到第3行(不包含第3行),以及从第0列到第2列(不包含第2列) # 注意:iloc的切片是排他性的,与Python列表切片行为一致 print(&amp;amp;quot;\n切片选择行1到3(不含3),列0到2(不含2):\n&amp;amp;quot;, df.iloc[1:3, 0:2])</pre>
登录后复制
</div></li> </ul> <p><strong>3. 使用布尔索引进行条件筛选</strong></p> <p>布尔索引是我在进行数据清洗和分析时最常用的功能之一,它允许你根据一个或多个条件来选择行。</p> <ul> <li> <p><strong>单条件筛选:</strong></p><div class="code" style="position:relative; padding:0px; margin:0px;"><pre class='brush:python;toolbar:false;'># 选择列'A'中值大于2的所有行 print(&amp;amp;quot;\n选择列'A'中值大于2的所有行:\n&amp;amp;quot;, df[df['A'] &amp;amp;gt; 2])</pre>
登录后复制
</div></li> <li> <p><strong>多条件筛选:</strong> 使用 <div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false;">&amp;amp;</pre>
登录后复制
</div> (AND), <div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false;">|</pre>
登录后复制
</div> (OR), <div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false;">~</pre>
登录后复制
</div> (NOT) 运算符,并且每个条件表达式必须用括号括起来。</p><div class="code" style="position:relative; padding:0px; margin:0px;"><pre class='brush:python;toolbar:false;'># 选择列'A'大于2且列'B'小于8的所有行 print("\n选择列'A'>2且'B'<8的所有行:\n", df[(df['A'] > 2) &amp;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)])</pre>
登录后复制
</div></li> <li> <p><strong>结合 <div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false;">loc</pre>
登录后复制
</div> 进行布尔索引和列选择:</strong></p><div class="code" style="position:relative; padding:0px; margin:0px;"><pre class='brush:python;toolbar:false;'># 选择列'A'大于2的所有行的列'B'和'C' print(&amp;quot;\n选择列'A'&amp;gt;2的所有行的列'B'和'C':\n&amp;quot;, df.loc[df['A'] &amp;gt; 2, ['B', 'C']])</pre>
登录后复制
</div></li> </ul> <h3>在Pandas中,<div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false;">loc</pre>
登录后复制
</div>和<div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false;">iloc</pre>
登录后复制
</div>究竟有何<a style="color:#f60; text-decoration:underline;" title="区别" href="https://www.php.cn/zt/27988.html" target="_blank">区别</a>,我该如何选择?</h3> <p>这确实是初学者,甚至是一些有经验的用户也时常会混淆的地方。说实话,刚开始用的时候我也常常搞不清楚什么时候该用哪个。但核心的区别其实非常简单:<div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false;">loc</pre>
登录后复制
</div>是基于<strong>标签(label)</strong>的,而<div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false;">iloc</pre>
登录后复制
</div>是基于<strong>整数位置(integer location)</strong>的。</p> <p>想象一下你有一本书,<div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false;">loc</pre>
登录后复制
</div>就像你在目录里找“第三章”或者“附录A”一样,它关心的是章节的名字。而<div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false;">iloc</pre>
登录后复制
</div>则像你在书架上数“从上往下第三本书”或者“从左往右第五页”,它关心的是物理上的顺序。</p> <p><strong><div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false;">loc</pre>
登录后复制
</div>的特点:</strong></p> <ul> <li> <strong>使用行索引和列名。</strong> 如果你的DataFrame有自定义的行索引(比如日期、ID、类别名称),或者你希望用明确的列名来操作,<div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false;">loc</pre>
登录后复制
</div>是你的首选。</li> <li> <strong>切片是包含结束点的。</strong> 这一点非常关键,也是和Python原生切片行为不同的地方。比如 <div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false;">df.loc['start_label':'end_label']</pre>
登录后复制
</div> 会包含 <div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false;">end_label</pre>
登录后复制
</div> 对应的行或列。这在处理时间序列数据或者有明确范围的数据时非常方便。</li> <li> <strong>可以进行布尔索引。</strong> 结合条件筛选时,<div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false;">loc</pre>
登录后复制
</div>能让你在筛选行的同时,也指定要查看哪些列,这比单独的布尔索引更强大和灵活。</li> </ul> <p><strong><div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false;">iloc</pre>
登录后复制
</div>的特点:</strong></p> <ul> <li> <strong>使用从0开始的整数位置。</strong> 它不关心你的行索引或列名是什么,只关心它们在DataFrame中的<a style="color:#f60; text-decoration:underline;" title="排列" href="https://www.php.cn/zt/56129.html" target="_blank">排列</a>顺序。</li> <li> <strong>切片是排他性的。</strong> 比如 <div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false;">df.iloc[0:5]</pre>
登录后复制
</div> 会选择索引为0到4的行,不包含第5行。这和Python列表的切片行为完全一致,对于熟悉Python的人来说更容易理解。</li> <li> <strong>适合循环或需要按位置动态选择数据时。</strong> 当你需要遍历DataFrame的特定部分,或者你的选择逻辑是基于数据在DataFrame中的物理位置时,<div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false;">iloc</pre>
登录后复制
</div>就显得非常方便。</li> </ul> <p><strong>我该如何选择?</strong></p> <div class="aritcle_card"> <a class="aritcle_card_img" href="/ai/1397"> <img src="https://img.php.cn/upload/ai_manual/000/000/000/175680029112420.png" alt="Voicv"> </a> <div class="aritcle_card_info"> <a href="/ai/1397">Voicv</a> <p>克隆你的声音,就像Ctrl+C, Ctrl+V一样</p> <div class=""> <img src="/static/images/card_xiazai.png" alt="Voicv"> <span>165</span> </div> </div> <a href="/ai/1397" class="aritcle_card_btn"> <span>查看详情</span> <img src="/static/images/cardxiayige-3.png" alt="Voicv"> </a> </div> <p>我的建议是:</p> <ol> <li> <strong>优先使用 <div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false;">loc</pre>
登录后复制
</div>。</strong> 如果你的DataFrame有有意义的行索引和列名,并且你的操作是基于这些标签的,那么<div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false;">loc</pre>
登录后复制
</div>能让你的代码更具可读性和健壮性。即使数据的顺序发生变化,只要标签不变,你的代码依然能正确工作。</li> <li> <strong>当需要按位置操作时使用 <div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false;">iloc</pre>
登录后复制
</div>。</strong> 比如,你总是想获取DataFrame的第一行,或者最后一列,而不管它们的标签是什么。或者在某些算法中,你需要基于数据的相对位置进行切片。</li> <li> <strong>避免混合使用。</strong> 尽量保持代码风格的一致性,减少混淆。</li> </ol> <p>一个常见的错误就是把<div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false;">loc</pre>
登录后复制
</div>的切片行为(包含结束)和<div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false;">iloc</pre>
登录后复制
</div>的切片行为(不包含结束)搞混。我个人在写代码的时候,如果涉及到切片,会特别留意当前用的是<div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false;">loc</pre>
登录后复制
</div>还是<div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false;">iloc</pre>
登录后复制
</div>,避免因为这个小细节导致数据选择错误。</p> <h3>如何利用布尔索引进行复杂的数据筛选,有哪些常见陷阱?</h3> <p>布尔索引是Pandas数据筛选的利器,它允许你根据数据的实际值来动态选择行,这在数据分析和清洗中几乎是无处不在的。</p> <p><strong>利用布尔索引进行复杂筛选:</strong></p> <ul> <li> <p><strong>多条件组合:</strong> 如前面所示,使用 <div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false;">&amp;amp;</pre>
登录后复制
</div> (AND), <div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false;">|</pre>
登录后复制
</div> (OR), <div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false;">~</pre>
登录后复制
</div> (NOT) 运算符可以组合多个条件。例如,如果你想找出年龄在18到30岁之间,并且是女性的用户数据:</p><div class="code" style="position:relative; padding:0px; margin:0px;"><pre class='brush:python;toolbar:false;'># 假设df有一个'Age'和'Gender'列 # df[(df['Age'] >= 18) &amp;amp; (df['Age'] <= 30) &amp;amp; (df['Gender'] == 'Female')]</pre>
登录后复制
</div><p>这里的关键是每个独立的条件表达式都必须用括号 <div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false;">()</pre>
登录后复制
</div> 括起来,因为Python的位运算符(<div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false;">&amp;amp;</pre>
登录后复制
</div>, <div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false;">|</pre>
登录后复制
</div>)优先级高于比较运算符(<div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false;">></pre>
登录后复制
</div>, <div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false;"><</pre>
登录后复制
</div>, <div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false;">==</pre>
登录后复制
</div>等)。如果没有括号,可能会导致意想不到的错误。</p> </li> <li> <p><strong>使用 <div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false;">isin()</pre>
登录后复制
</div> 方法:</strong> 当你想选择某一列的值在某个特定列表中的所有行时,<div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false;">isin()</pre>
登录后复制
</div> 方法非常方便。</p><div class="code" style="position:relative; padding:0px; margin:0px;"><pre class='brush:python;toolbar:false;'># 选择列'City'是'New York'或'London'的行 # df[df['City'].isin(['New York', 'London'])]</pre>
登录后复制
</div><p>这比写 <div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false;">(df['City'] == 'New York') | (df['City'] == 'London')</pre>
登录后复制
</div> 要简洁得多,尤其当列表很长时。</p> </li> <li> <p><strong>使用 <div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false;">str.contains()</pre>
登录后复制
</div> 进行字符串匹配:</strong> 如果你的列是字符串类型,并且你需要根据子字符串匹配来筛选,<div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false;">str.contains()</pre>
登录后复制
</div> 是一个很好的选择。</p><div class="code" style="position:relative; padding:0px; margin:0px;"><pre class='brush:python;toolbar:false;'># 选择列'Description'中包含'error'关键词的行 # df[df['Description'].str.contains('error', na=False)]</pre>
登录后复制
</div><p><div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false;">na=False</pre>
登录后复制
</div> 参数很重要,它指定了如何处理NaN值。如果为<div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false;">True</pre>
登录后复制
</div>,则NaN值也会被视为包含(或不包含,取决于具体实现),通常我们希望它们不匹配。</p> </li> </ul> <p><strong>常见陷阱:</strong></p> <ol> <li> <p><strong>忘记括号:</strong> 这是最常见的错误,没有之一。</p><div class="code" style="position:relative; padding:0px; margin:0px;"><pre class='brush:python;toolbar:false;'># 错误示例: # df[df['A'] > 2 &amp;amp; df['B'] < 8] # 这会先计算 2 &amp;amp; df['B'],然后用 df['A'] > (结果) # 正确写法: # df[(df['A'] > 2) &amp;amp; (df['B'] < 8)]</pre>
登录后复制
</div><p>Pandas会告诉你一个 <div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false;">ValueError: The truth value of a Series is ambiguous</pre>
登录后复制
</div>,或者直接得到错误的结果。</p> </li> <li> <p><strong>处理 <div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false;">NaN</pre>
登录后复制
</div> 值:</strong> 当你的条件列中包含 <div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false;">NaN</pre>
登录后复制
</div>(Not a Number)时,布尔运算可能会产生意外结果。<div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false;">NaN</pre>
登录后复制
</div> 与任何值(包括它自己)的比较结果都是 <div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false;">False</pre>
登录后复制
</div>。</p><div class="code" style="position:relative; padding:0px; margin:0px;"><pre class='brush:python;toolbar:false;'># 假设df有一个包含NaN的'Value'列 # df[df['Value'] > 10] # 结果会排除所有NaN的行,即使你可能希望它们被包含在内或单独处理。</pre>
登录后复制
</div><p>处理 <div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false;">NaN</pre>
登录后复制
</div> 的常见方法是:</p> <ul> <li> <strong><div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false;">dropna()</pre>
登录后复制
</div>:</strong> 在筛选前先删除包含 <div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false;">NaN</pre>
登录后复制
</div> 的行。</li> <li> <strong><div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false;">fillna()</pre>
登录后复制
</div>:</strong> 在筛选前先用某个值填充 <div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false;">NaN</pre>
登录后复制
</div>。</li> <li> <strong><div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false;">isna()</pre>
登录后复制
</div> / <div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false;">notna()</pre>
登录后复制
</div>:</strong> 专门用来检查 <div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false;">NaN</pre>
登录后复制
</div> 值。<div class="code" style="position:relative; padding:0px; margin:0px;"><pre class='brush:python;toolbar:false;'># 选择'Value'列不是NaN的行 # df[df['Value'].notna()]</pre>
登录后复制
</div></li> </ul> </li> <li><p><strong>对Series进行布尔运算时,Series的索引必须对齐。</strong> 如果你创建了一个布尔Series,它的索引与DataFrame的索引不匹配,Pandas会尝试对齐,如果对齐失败(例如,索引标签不完全一致),可能会填充 <div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false;">NaN</pre>
登录后复制
</div>,然后导致错误或意外结果。通常,我们直接在DataFrame内部生成布尔Series,所以这个问题不常遇到,但了解其原理有助于调试。</p></li> </ol> <p>布尔索引的强大之处在于它的灵活性,但这种灵活性也要求我们对数据类型和运算符优先级有清晰的认识。我通常会把复杂的条件分解成小的、可测试的部分,确保每个布尔Series都按预期生成,然后再组合起来。</p> <h3>除了基础索引,还有哪些高级技巧能提升我的数据选择效率?</h3> <p>在掌握了<div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false;">loc</pre>
登录后复制
</div>、<div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false;">iloc</pre>
登录后复制
</div>和布尔索引这些基础之后,还有一些高级技巧和最佳实践可以进一步提升你在Pandas中选择数据的效率和代码的可读性,同时避免一些常见的性能陷阱。</p> <ol> <li> <p><strong>避免链式索引 (Ch<a style="color:#f60; text-decoration:underline;" title="ai" href="https://www.php.cn/zt/17539.html" target="_blank">ai</a>ned Indexing) 写入操作,警惕 <div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false;">SettingWithCopyWarning</pre>
登录后复制
</div>:</strong> 这是Pandas用户经常遇到的一个“坑”。当你像这样操作时:</p><div class="code" style="position:relative; padding:0px; margin:0px;"><pre class='brush:python;toolbar:false;'># df[df['col_A'] > 5]['col_B'] = 10 # 错误或产生警告</pre>
登录后复制
</div><p>你可能会遇到 <div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false;">SettingWithCopyWarning</pre>
登录后复制
</div>。这是因为 <div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false;">df[df['col_A'] > 5]</pre>
登录后复制
</div> 返回的可能是一个“视图”(view)而不是一个“副本”(copy)。当你试图修改一个视图时,修改可能不会反映到原始DataFrame上,或者即使反映了,Pandas也会发出警告,因为它不确定你的意图。</p> <p><strong>正确且推荐的做法是使用 <div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false;">loc</pre>
登录后复制
</div> 或 <div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false;">iloc</pre>
登录后复制
</div>:</strong></p><div class="code" style="position:relative; padding:0px; margin:0px;"><pre class='brush:python;toolbar:false;'># 修改满足条件的行的特定列 df.loc[df['col_A'] > 5, 'col_B'] = 10</pre>
登录后复制
</div><p>这种方式明确地告诉Pandas,你打算在原始DataFrame上进行修改,它会返回一个指向原始数据的引用,确保修改生效。</p> </li> <li> <p><strong>使用 <div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false;">query()</pre>
登录后复制
</div> 进行字符串表达式筛选:</strong> 对于复杂的布尔条件筛选,特别是当条件涉及多个列时,<div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false;">query()</pre>
登录后复制
</div> 方法能让你的代码更像SQL语句,可读性大大提高。它接受一个字符串表达式。</p><div class="code" style="position:relative; padding:0px; margin:0px;"><pre class='brush:python;toolbar:false;'># 假设df有'Age', 'Gender', 'Score'列 # df.query('Age > 25 and Gender == "Male" and Score > 80')</pre>
登录后复制
</div><p><div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false;">query()</pre>
登录后复制
</div> 内部会进行优化,在某些情况下,它的性能可能比直接的布尔索引更好,因为它避免了创建多个中间的布尔Series。它也支持使用 <div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false;">@</pre>
登录后复制
</div> 符号引用外部变量:</p><div class="code" style="position:relative; padding:0px; margin:0px;"><pre class='brush:python;toolbar:false;'>min_age = 25 # df.query('Age > @min_age')</pre>
登录后复制
</div></li> <li> <p><strong>使用 <div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false;">filter()</pre>
登录后复制
</div> 进行列的筛选:</strong> 如果你需要根据列名的一部分、<a style="color:#f60; text-decoration:underline;" title="正则表达式" href="https://www.php.cn/zt/15947.html" target="_blank">正则表达式</a>或者一个列表来选择列,<div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false;">filter()</pre>
登录后复制
</div> 方法非常有用。</p><div class="code" style="position:relative; padding:0px; margin:0px;"><pre class='brush:python;toolbar:false;'># 选择列名中包含'A'的列 # df.filter(like='A') # 选择列名以'C'开头的列 # df.filter(regex='^C') # 选择特定列(与df[['col1', 'col2']]类似,但更灵活) # df.filter(items=['col1', 'col2'])</pre>
登录后复制
</div><p>这在处理大量列或者需要动态选择列时非常方便。</p> </li> <li> <p><strong><div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false;">at</pre>
登录后复制
</div> 和 <div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false;">iat</pre>
登录后复制
</div> 用于快速单值访问:</strong> 当你知道确切的行标签/位置和列名/位置,并且只需要访问或修改单个单元格时,<div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false;">at</pre>
登录后复制
</div> 和 <div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false;">iat</pre>
登录后复制
</div> 比 <div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false;">loc</pre>
登录后复制
</div> 和 <div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false;">iloc</pre>
登录后复制
</div> 效率更高。它们是针对单点访问进行了优化的。</p><div class="code" style="position:relative; padding:0px; margin:0px;"><pre class='brush:python;toolbar:false;'># 获取索引为'y',列为'A'的值 # value = df.at['y', 'A'] # 修改索引为'z',列为'C'的值 # df.at['z', 'C'] = 100 # 获取第1行,第0列的值 # value = df.iat[1, 0]</pre>
登录后复制
</div><p>虽然这看起来是微小的优化,但在大型数据集上进行大量单点操作时,累积起来的性能提升会很显著。</p> </li> </ol> <p>这些高级技巧并非每次数据选择都必须使用,但它们提供了更高效、更具可读性或更安全的选择。在实际工作中,我通常会根据具体场景和数据规模来决定使用哪种方法。例如,对于简单的筛选,直接布尔索引就足够了;但如果条件复杂或者需要避免<div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false;">SettingWithCopyWarning</pre>
登录后复制
</div>,<div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false;">loc</pre>
登录后复制
</div>和<div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false;">query()</pre>
登录后复制
</div>就是更好的选择。理解这些<a style="color:#f60; text-decoration:underline;" title="工具" href="https://www.php.cn/zt/16887.html" target="_blank">工具</a>的适用场景,能让你在数据处理的道路上走得更远。</p>

以上就是Python怎么从pandas DataFrame中选择特定的行和列_pandas数据索引与切片技巧的详细内容,更多请关注php中文网其它相关文章!

最佳 Windows 性能的顶级免费优化软件
最佳 Windows 性能的顶级免费优化软件

每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。

下载
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号