在数据分析工作中,准确获取和操作 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")