Pandas DataFrame 列数操作完全指南

在数据分析工作中,准确获取和操作 DataFrame 的列数是常见需求。本文将深入探讨 pandas DataFrame 列数的各种操作方法。

基础导入和设置

python 复制代码
import pandas as pd
import numpy as np
print("pandas版本:", pd.__version__)
print("numpy版本:", np.__version__)

基础方法

使用 shape 属性

python 复制代码
import pandas as pd
import numpy as np

# 创建全新的示例 DataFrame
df_shape = pd.DataFrame({
    '学生ID': [1, 2, 3, 4],
    '姓名': ['张三', '李四', '王五', '赵六'],
    '数学成绩': [85, 92, 78, 88],
    '英语成绩': [90, 85, 92, 79],
    '物理成绩': [88, 76, 85, 91]
})

# 获取列数
num_columns = df_shape.shape[1]
print(f"DataFrame 的列数为: {num_columns}")
print(f"DataFrame 的形状 (行数, 列数): {df_shape.shape}")

使用 columns 属性

python 复制代码
import pandas as pd

# 创建全新的 DataFrame
df_columns = pd.DataFrame({
    '产品名称': ['手机', '笔记本', '平板', '耳机'],
    '价格': [2999, 5999, 3999, 899],
    '库存数量': [50, 30, 40, 100],
    '类别': ['电子', '电子', '电子', '配件']
})

# 获取列数
num_columns = len(df_columns.columns)
print(f"DataFrame 的列数为: {num_columns}")
print(f"列名列表: {list(df_columns.columns)}")
print(f"列名详细信息: {df_columns.columns}")

使用 info() 方法

python 复制代码
import pandas as pd

# 创建全新的 DataFrame
df_info = pd.DataFrame({
    '城市': ['北京', '上海', '广州', '深圳'],
    '人口(万)': [2154, 2428, 1868, 1756],
    'GDP(亿元)': [36103, 38701, 25019, 27670],
    '面积(km²)': [16410, 6340, 7434, 1997]
})

# 使用 info() 查看列数信息
print("DataFrame 信息:")
df_info.info()

高级应用

动态列数统计

python 复制代码
import pandas as pd
import numpy as np

# 创建包含多种数据类型的全新 DataFrame
df_dynamic = pd.DataFrame({
    '员工ID': [101, 102, 103, 104, 105],
    '姓名': ['Alice', 'Bob', 'Charlie', 'David', 'Eve'],
    '年龄': [28, 32, 45, 29, 38],
    '薪资': [25000, 32000, 48000, 27000, 42000],
    '部门': ['技术部', '市场部', '技术部', '人事部', '市场部'],
    '入职日期': pd.to_datetime(['2020-01-15', '2018-06-20', '2015-03-10', '2019-08-05', '2017-11-30']),
    '是否全职': [True, True, True, False, True]
})

# 统计数值型列的个数
numeric_cols = df_dynamic.select_dtypes(include=[np.number])
print(f"数值型列的个数: {len(numeric_cols.columns)}")
print(f"数值型列名: {list(numeric_cols.columns)}")

# 统计文本型列的个数
string_cols = df_dynamic.select_dtypes(include=[object])
print(f"文本型列的个数: {len(string_cols.columns)}")
print(f"文本型列名: {list(string_cols.columns)}")

# 统计布尔型列的个数
bool_cols = df_dynamic.select_dtypes(include=[bool])
print(f"布尔型列的个数: {len(bool_cols.columns)}")
print(f"布尔型列名: {list(bool_cols.columns)}")

条件列数统计

python 复制代码
import pandas as pd

# 创建全新的销售数据 DataFrame
sales_df = pd.DataFrame({
    '产品编号': ['P001', 'P002', 'P003', 'P004', 'P005'],
    '产品名称': ['iPhone', 'MacBook', 'iPad', 'AirPods', 'Watch'],
    '一月销量': [150, 80, 120, 200, 180],
    '二月销量': [160, 85, 130, 210, 190],
    '三月销量': [170, 90, 140, 220, 200],
    '四月销量': [180, 95, 150, 230, 210],
    '类别': ['手机', '电脑', '平板', '耳机', '手表']
})

# 统计包含 '销量' 的列数
sales_columns = [col for col in sales_df.columns if '销量' in col]
sales_count = len(sales_columns)
print(f"销售相关列的个数: {sales_count}")
print(f"销售相关列名: {sales_columns}")

# 使用 filter 方法
filtered_sales = sales_df.filter(like='销量')
print(f"\n使用 filter 方法的结果:")
print(f"销售列数: {len(filtered_sales.columns)}")
print(f"销售列数据:\n{filtered_sales.head()}")

性能比较

python 复制代码
import pandas as pd
import numpy as np
import time

# 创建全新的大型 DataFrame
performance_df = pd.DataFrame(np.random.randn(500, 300))
performance_df.columns = [f'col_{i}' for i in range(performance_df.shape[1])]

# 测试不同方法的性能
methods = []
times = []

# 测试 shape 方法
start = time.time()
for _ in range(100):
    result = performance_df.shape[1]
shape_time = time.time() - start
methods.append('shape[1]')
times.append(shape_time)

# 测试 len(columns) 方法
start = time.time()
for _ in range(100):
    result = len(performance_df.columns)
len_time = time.time() - start
methods.append('len(columns)')
times.append(len_time)

# 显示性能结果
print("性能测试结果:")
for method, t in zip(methods, times):
    print(f"{method}: {t:.6f} 秒")

print(f"\n性能差异: {abs(shape_time - len_time):.6f} 秒")

实际应用场景

数据质量检查

python 复制代码
import pandas as pd

# 创建包含缺失值的全新 DataFrame
quality_check_df = pd.DataFrame({
    '订单号': [1001, 1002, 1003, 1004, 1005],
    '客户姓名': ['张三', '李四', None, '王五', '赵六'],
    '订单金额': [299.0, None, 599.0, 399.0, 899.0],
    '支付方式': ['支付宝', '微信', '信用卡', None, '支付宝'],
    '配送状态': ['已发货', '已发货', None, '已收货', '已发货']
})

print("原始数据:")
print(quality_check_df)

# 数据质量分析
total_columns = quality_check_df.shape[1]
columns_with_missing = quality_check_df.isnull().any()
missing_columns_count = columns_with_missing.sum()

print(f"\n数据质量报告:")
print(f"总列数: {total_columns}")
print(f"有缺失值的列数: {missing_columns_count}")
print(f"完整列数: {total_columns - missing_columns_count}")
print(f"有缺失值的列名: {list(quality_check_df.columns[columns_with_missing])}")

自动化数据处理函数

python 复制代码
import pandas as pd
import numpy as np

def analyze_dataframe(df, df_name="DataFrame"):
    """自动化分析 DataFrame 的基本特征"""
    print(f"\n=== {df_name} 分析报告 ===")
    
    total_columns = df.shape[1]
    numeric_columns = len(df.select_dtypes(include=[np.number]).columns)
    categorical_columns = len(df.select_dtypes(include=[object]).columns)
    datetime_columns = len(df.select_dtypes(include=['datetime']).columns)
    bool_columns = len(df.select_dtypes(include=[bool]).columns)
    
    print(f"总列数: {total_columns}")
    print(f"数值型列数: {numeric_columns}")
    print(f"分类型列数: {categorical_columns}")
    print(f"日期时间列数: {datetime_columns}")
    print(f"布尔型列数: {bool_columns}")
    print(f"其他类型列数: {total_columns - numeric_columns - categorical_columns - datetime_columns - bool_columns}")
    
    return {
        'total_columns': total_columns,
        'numeric_columns': numeric_columns,
        'categorical_columns': categorical_columns,
        'datetime_columns': datetime_columns,
        'bool_columns': bool_columns
    }

# 测试函数
test_df = pd.DataFrame({
    'id': [1, 2, 3, 4],
    'name': ['Alice', 'Bob', 'Charlie', 'David'],
    'age': [25, 30, 35, 40],
    'salary': [50000.0, 60000.0, 70000.0, 80000.0],
    'is_manager': [False, True, False, True],
    'hire_date': pd.to_datetime(['2020-01-01', '2019-06-15', '2018-03-20', '2017-12-10'])
})

analysis_result = analyze_dataframe(test_df, "员工信息表")

数学表达与理论

在数据处理中,列数的概念可以形式化表示为:

设 DataFrame DDD 有 nnn 个样本(行)和 mmm 个特征(列),则列数可以表示为:

m=∣C∣m = |C|m=∣C∣

其中 CCC 是列名的集合,∣C∣|C|∣C∣ 表示集合的基数。

对于包含 kkk 种数据类型的 DataFrame,列数可以分解为:

m=∑i=1kmim = \sum_{i=1}^{k} m_im=i=1∑kmi

其中 mim_imi 表示第 iii 种数据类型的列数。

python 复制代码
import pandas as pd

# 演示数学概念的实际应用
df_math = pd.DataFrame({
    'feature1': [1, 2, 3],
    'feature2': [4.1, 5.2, 6.3],
    'category': ['A', 'B', 'C'],
    'flag': [True, False, True]
})

# 计算各种数据类型的列数
m = df_math.shape[1]  # 总列数
m_numeric = len(df_math.select_dtypes(include=['number']).columns)
m_categorical = len(df_math.select_dtypes(include=['object']).columns)
m_boolean = len(df_math.select_dtypes(include=['bool']).columns)

print(f"总列数 m = {m}")
print(f"数值型列数 m_numeric = {m_numeric}")
print(f"分类型列数 m_categorical = {m_categorical}")
print(f"布尔型列数 m_boolean = {m_boolean}")
print(f"验证: m_numeric + m_categorical + m_boolean = {m_numeric + m_categorical + m_boolean}")

最佳实践和错误处理

python 复制代码
import pandas as pd

def safe_get_column_count(df, df_name="DataFrame"):
    """安全获取 DataFrame 列数,包含错误处理"""
    if df is None:
        print(f"错误: {df_name} 为 None")
        return 0
    
    try:
        column_count = df.shape[1]
        print(f"{df_name} 的列数为: {column_count}")
        return column_count
    except AttributeError:
        print(f"错误: {df_name} 不是 pandas DataFrame")
        return 0
    except Exception as e:
        print(f"获取 {df_name} 列数时发生错误: {e}")
        return 0

# 测试各种情况
print("=== 安全列数获取测试 ===")

# 正常情况
normal_df = pd.DataFrame({'A': [1, 2], 'B': [3, 4]})
safe_get_column_count(normal_df, "正常DataFrame")

# None 情况
safe_get_column_count(None, "空DataFrame")

# 非DataFrame情况
safe_get_column_count([1, 2, 3], "列表")

# 空DataFrame
empty_df = pd.DataFrame()
safe_get_column_count(empty_df, "空DataFrame")
相关推荐
程序猿小D2 小时前
【完整源码+数据集+部署教程】脑部CT图像分割系统源码和数据集:改进yolo11-CSwinTransformer
python·yolo·计算机视觉·数据集·yolo11·脑部ct图像分割
max5006002 小时前
北京大学MuMo多模态肿瘤分类模型复现与迁移学习
人工智能·python·机器学习·分类·数据挖掘·迁移学习
修一呀2 小时前
[后端快速搭建]基于 Django+DeepSeek API 快速搭建智能问答后端
后端·python·django
WSSWWWSSW2 小时前
Seaborn数据可视化实战:Seaborn数据可视化实战入门
python·信息可视化·数据挖掘·数据分析·matplotlib·seaborn
小石3 小时前
Python 装饰器核心知识点:无参装饰器构建、带参装饰器扩展及函数与类实现差异
python
巴厘猫4 小时前
从 Manim 中提取表格 / 坐标系并转 GIF:实用方案与核心代码
python·音视频开发
数据智能老司机4 小时前
Python 实战遗传算法——遗传算法导论
python·算法·机器学习
让心淡泊1445 小时前
DAY 58 经典时序预测模型2
python
love530love5 小时前
怎么更新 cargo.exe ?(Rust 工具链)
人工智能·windows·python·rust·r语言