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")
相关推荐
databook6 小时前
Manim实现闪光轨迹特效
后端·python·动效
Juchecar8 小时前
解惑:NumPy 中 ndarray.ndim 到底是什么?
python
用户8356290780518 小时前
Python 删除 Excel 工作表中的空白行列
后端·python
Json_8 小时前
使用python-fastApi框架开发一个学校宿舍管理系统-前后端分离项目
后端·python·fastapi
数据智能老司机15 小时前
精通 Python 设计模式——分布式系统模式
python·设计模式·架构
数据智能老司机16 小时前
精通 Python 设计模式——并发与异步模式
python·设计模式·编程语言
数据智能老司机16 小时前
精通 Python 设计模式——测试模式
python·设计模式·架构
数据智能老司机16 小时前
精通 Python 设计模式——性能模式
python·设计模式·架构
c8i16 小时前
drf初步梳理
python·django
每日AI新事件16 小时前
python的异步函数
python