0

0

Pandas DataFrame中精确选择重复列与指定列的技巧

DDD

DDD

发布时间:2025-09-28 11:07:12

|

875人浏览过

|

来源于php中文网

原创

Pandas DataFrame中精确选择重复列与指定列的技巧

本文详细介绍了在Pandas DataFrame中高效选择指定列和所有重复列的技巧。通过结合使用df.loc、df.columns.duplicated(keep=False)和df.columns.isin()进行布尔索引,即使DataFrame包含同名列,也能精准且灵活地提取所需数据,同时保持列的原始顺序和名称,避免了传统索引方式的局限性。

理解Pandas列选择的挑战

在pandas中,当dataframe的列名包含重复项时,直接使用列名列表进行索引(例如df[['a', 'x', 'x']])可能会遇到问题。pandas的index对象(df.columns)在默认情况下会将同名列视为一个整体,或者在某些操作中只返回第一个匹配项,这与我们希望选择所有同名列实例的需求不符。例如,如果一个dataframe有三列都叫'x',我们希望选择所有这三列,以及特定的非重复列(如'a'),就需要一种更高级的筛选方法。

核心解决方案:结合布尔索引与loc

解决这个问题的关键在于利用df.loc的强大功能,结合布尔索引来精确指定我们想要选择的列。具体来说,我们可以构造一个布尔序列,该序列在需要选择的列位置为True,否则为False。

这个布尔序列可以通过两个主要条件组合而成:

  1. 识别所有重复列: 使用df.columns.duplicated(keep=False)。keep=False参数至关重要,它会标记所有重复的列名(包括第一次出现的和后续出现的),而不仅仅是第二次及以后出现的。
  2. 识别指定的非重复列: 使用df.columns.isin(['指定列名列表'])。这会返回一个布尔序列,指示哪些列名存在于我们指定的列表中。

将这两个布尔序列通过逻辑或(|)操作符结合起来,就可以得到最终的布尔序列,用于df.loc的列选择。

示例代码

假设我们有以下DataFrame,并希望选择列'a'以及所有名为'x'的列:

可赞AI
可赞AI

文字一秒可视化,免费AI办公神器

下载
import pandas as pd
import numpy as np

# 原始DataFrame
data = {
    'a': [6, 6, 6, 8, 5],
    'x': [2, 6, 6, 3, 7],
    'x ': [7, 3, 7, 6, 5], # 注意这里为了演示,我将第二个'x'列名改成了'x ',实际操作中如果列名完全相同,Pandas会保持
    'x  ': [7, 1, 5, 1, 3], # 同样,第三个'x'列名改成了'x  '
    'z': [8, 1, 6, 8, 0]
}
# 为了模拟原始问题中列名完全重复的情况,我们手动创建DataFrame
df = pd.DataFrame(np.array([
    [6, 2, 7, 7, 8],
    [6, 6, 3, 1, 1],
    [6, 6, 7, 5, 6],
    [8, 3, 6, 1, 8],
    [5, 7, 5, 3, 0]
]), columns=["a", "x", "x", "x", "z"])

print("原始DataFrame:")
print(df)

# 核心解决方案
# 1. 找出所有重复的列(包括第一次出现的)
duplicated_cols_mask = df.columns.duplicated(keep=False)

# 2. 找出需要额外包含的特定列(例如'a')
specific_cols_mask = df.columns.isin(['a'])

# 3. 将两个条件通过逻辑或组合
combined_mask = duplicated_cols_mask | specific_cols_mask

# 4. 使用loc和布尔掩码进行列选择
out_df = df.loc[:, combined_mask]

print("\n期望的输出DataFrame:")
print(out_df)

输出结果:

原始DataFrame:
   a  x  x  x  z
0  6  2  7  7  8
1  6  6  3  1  1
2  6  6  7  5  6
3  8  3  6  1  8
4  5  7  5  3  0

期望的输出DataFrame:
   a  x  x  x
0  6  2  7  7
1  6  6  3  1
2  6  6  7  5
3  8  3  6  1
4  5  7  5  3

原理剖析

  • df.columns.duplicated(keep=False): 这个方法会返回一个布尔型Series,其长度与DataFrame的列数相同。keep=False参数是关键,它确保所有出现过的重复列名都被标记为True。例如,对于["a", "x", "x", "x", "z"],它会返回[False, True, True, True, False]。
  • df.columns.isin(['a']): 这个方法同样返回一个布尔型Series,指示哪些列名在给定的列表中。对于["a", "x", "x", "x", "z"]和列表['a'],它会返回[True, False, False, False, False]。
  • 布尔运算 |: 逻辑或操作符将这两个布尔Series组合起来。只要任一条件为True,最终结果就为True。
    • [False, True, True, True, False] (重复列)
    • [True, False, False, False, False] (特定列'a')
    • | 结果为 [True, True, True, True, False]
  • df.loc[:, combined_mask]: loc是基于标签的索引器。当其列选择器部分传入一个布尔Series时,它会选择所有对应位置为True的列。这样就实现了同时选择列'a'和所有名为'x'的列。

注意事项

  1. keep=False的重要性: 如果不使用keep=False(即使用默认值keep='first'),duplicated()只会将第二次及以后出现的重复列标记为True。这不符合我们选择所有重复列的需求。
  2. 列的顺序: 这种方法会保留原始DataFrame中列的相对顺序。
  3. 精确性: 这种方法能够精确地选择所有符合条件的列,无论是特定名称的列还是所有重复名称的列。
  4. 与col_select列表的区别 原始问题中提到了一个col_select = ["a","x","x","x"]列表。本文的解决方案是基于DataFrame 实际存在的列 来进行判断和选择的。它会选择所有名为'x'的列(无论有多少个),以及所有名为'a'的列。如果你需要根据一个精确的col_select列表来选择特定数量的重复列(例如,只选择前两个'x'),那么可能需要更复杂的逻辑,例如结合df.columns.get_loc()来获取每个列名的所有位置索引,然后通过iloc进行选择。但对于“选择列'a'和所有名称重复的列”这一常见需求,本文的方案更为简洁高效。

总结

在Pandas DataFrame中处理包含重复列名的复杂选择任务时,df.loc结合布尔索引提供了一个强大且灵活的解决方案。通过精确地构造布尔掩码(利用df.columns.duplicated(keep=False)识别所有重复列,并用df.columns.isin()指定特定列),我们可以高效地提取所需数据,同时确保数据的完整性和列的原始结构。掌握这一技巧,将显著提升您在数据处理中的灵活性和效率。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
Python 时间序列分析与预测
Python 时间序列分析与预测

本专题专注讲解 Python 在时间序列数据处理与预测建模中的实战技巧,涵盖时间索引处理、周期性与趋势分解、平稳性检测、ARIMA/SARIMA 模型构建、预测误差评估,以及基于实际业务场景的时间序列项目实操,帮助学习者掌握从数据预处理到模型预测的完整时序分析能力。

56

2025.12.04

Python 时间序列分析与预测
Python 时间序列分析与预测

本专题专注讲解 Python 在时间序列数据处理与预测建模中的实战技巧,涵盖时间索引处理、周期性与趋势分解、平稳性检测、ARIMA/SARIMA 模型构建、预测误差评估,以及基于实际业务场景的时间序列项目实操,帮助学习者掌握从数据预处理到模型预测的完整时序分析能力。

56

2025.12.04

拼多多赚钱的5种方法 拼多多赚钱的5种方法
拼多多赚钱的5种方法 拼多多赚钱的5种方法

在拼多多上赚钱主要可以通过无货源模式一件代发、精细化运营特色店铺、参与官方高流量活动、利用拼团机制社交裂变,以及成为多多进宝推广员这5种方法实现。核心策略在于通过低成本、高效率的供应链管理与营销,利用平台社交电商红利实现盈利。

34

2026.01.26

edge浏览器怎样设置主页 edge浏览器自定义设置教程
edge浏览器怎样设置主页 edge浏览器自定义设置教程

在Edge浏览器中设置主页,请依次点击右上角“...”图标 > 设置 > 开始、主页和新建标签页。在“Microsoft Edge 启动时”选择“打开以下页面”,点击“添加新页面”并输入网址。若要使用主页按钮,需在“外观”设置中开启“显示主页按钮”并设定网址。

8

2026.01.26

苹果官方查询网站 苹果手机正品激活查询入口
苹果官方查询网站 苹果手机正品激活查询入口

苹果官方查询网站主要通过 checkcoverage.apple.com/cn/zh/ 进行,可用于查询序列号(SN)对应的保修状态、激活日期及技术支持服务。此外,查找丢失设备请使用 iCloud.com/find,购买信息与物流可访问 Apple (中国大陆) 订单状态页面。

33

2026.01.26

npd人格什么意思 npd人格有什么特征
npd人格什么意思 npd人格有什么特征

NPD(Narcissistic Personality Disorder)即自恋型人格障碍,是一种心理健康问题,特点是极度夸大自我重要性、需要过度赞美与关注,同时极度缺乏共情能力,背后常掩藏着低自尊和不安全感,影响人际关系、工作和生活,通常在青少年时期开始显现,需由专业人士诊断。

3

2026.01.26

windows安全中心怎么关闭 windows安全中心怎么执行操作
windows安全中心怎么关闭 windows安全中心怎么执行操作

关闭Windows安全中心(Windows Defender)可通过系统设置暂时关闭,或使用组策略/注册表永久关闭。最简单的方法是:进入设置 > 隐私和安全性 > Windows安全中心 > 病毒和威胁防护 > 管理设置,将实时保护等选项关闭。

5

2026.01.26

2026年春运抢票攻略大全 春运抢票攻略教你三招手【技巧】
2026年春运抢票攻略大全 春运抢票攻略教你三招手【技巧】

铁路12306提供起售时间查询、起售提醒、购票预填、候补购票及误购限时免费退票五项服务,并强调官方渠道唯一性与信息安全。

37

2026.01.26

个人所得税税率表2026 个人所得税率最新税率表
个人所得税税率表2026 个人所得税率最新税率表

以工资薪金所得为例,应纳税额 = 应纳税所得额 × 税率 - 速算扣除数。应纳税所得额 = 月度收入 - 5000 元 - 专项扣除 - 专项附加扣除 - 依法确定的其他扣除。假设某员工月工资 10000 元,专项扣除 1000 元,专项附加扣除 2000 元,当月应纳税所得额为 10000 - 5000 - 1000 - 2000 = 2000 元,对应税率为 3%,速算扣除数为 0,则当月应纳税额为 2000×3% = 60 元。

13

2026.01.26

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
PHP新手语法线上课程教学
PHP新手语法线上课程教学

共13课时 | 0.9万人学习

光速学会docker容器
光速学会docker容器

共33课时 | 1.9万人学习

时间管理,自律给我自由
时间管理,自律给我自由

共5课时 | 0.8万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

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