大语言模型学习Pandas DataFrame 构造函数详解与进阶应用

内容分享21小时前发布
0 1 0

大语言模型学习Pandas DataFrame 构造函数详解与进阶应用

一、引言:DataFrame 的核心地位

Pandas 是 Python 数据科学栈中不可或缺的核心库,而 DataFrame 则是其最重大的数据结构之一。它提供了一个高效的、二维异构表格结构,用于存储和处理结构化数据,广泛应用于数据分析、清洗、可视化等领域。

DataFrame 构造函数(pandas.DataFrame())作为创建 DataFrame 对象的入口,是学习和使用 pandas 的第一步,也是构建灵活数据处理流程的关键。

二、DataFrame 构造函数完整语法

pandas.DataFrame(
data=None, # 数据源(任意类型)
index=None, # 行索引,默认 RangeIndex(0, n)
columns=None, # 列名,默认 RangeIndex(0, m)
dtype=None, # 数据类型
copy=False # 是否复制数据
)

参数详解:

参数

类型

说明

data

object

支持多种输入类型,是构造 DataFrame 的核心

index

Index or array-like

自定义行标签

columns

Index or array-like

自定义列标签

dtype

str, np.dtype, or dict

指定数据类型

copy

bool

是否复制输入数据

三、从不同数据源创建 DataFrame

3.1 从字典(Dictionary)创建(推荐方式)

✅ 单值字典(每列作为一个列表)

import pandas as pd
data_dict = {
'姓名': ['张三', '李四', '王五'],
'年龄': [23, 30, 45],
'收入': [5000, 7000, 12000]
}
df = pd.DataFrame(data=data_dict)
print(df)

姓名 年龄 收入
0 张三 23 5000
1 李四 30 7000
2 王五 45 12000

✅ 字典 + Series 构造列数据

from pandas import Series
data_dict_series = {
'product': Series(['A', 'B', 'C']),
'price': Series([100, 200, 300], index=[1, 2, 3]) # index 不同时,会做对齐!
}
df_series = pd.DataFrame(data_dict_series)
print(df_series)

⚠️ 注意:如果 Series 的 index 不一致,pandas 会自动对齐,缺失处填充 NaN。

3.2 从列表(Nested List)创建

✅ 每一行为一个子列表(按行组织)

data_list_rows = [
['张三', 23, 5000],
['李四', 30, 7000],
['王五', 45, 12000]
]
df_rows = pd.DataFrame(
data=data_list_rows,
columns=['姓名', '年龄', '收入'],
index=['员工A', '员工B', '员工C']
)
print(df_rows)

姓名 年龄 收入
员工A 张三 23 5000
员工B 李四 30 7000
员工C 王五 45 12000

✅ 每一列为一个子列表(按列组织)

在这种情况下,需结合 .T 转置来实现:

data_list_cols = [
['张三', '李四', '王五'],
[23, 30, 45],
[5000, 7000, 12000]
]
df_cols = pd.DataFrame(
data=data_list_cols,
index=['姓名', '年龄', '收入']
).T
print(df_cols)

3.3 从 NumPy 数组创建

import numpy as np
array_data = np.array([
[1, 2, 3],
[4, 5, 6],
[7, 8, 9]
])
df_array = pd.DataFrame(
data=array_data,
index=['row1', 'row2', 'row3'],
columns=['col1', 'col2', 'col3']
)
print(df_array)

col1 col2 col3
row1 1 2 3
row2 4 5 6
row3 7 8 9

NumPy 的优势在于可以保持内存效率,尤其适合大规模数值计算。

3.4 从 Series 创建(单列 or 多列)

✅ 从一个 Series 创建:

series = pd.Series([10, 20, 30], name='Values')
df_series_single = pd.DataFrame(series)
print(df_series_single)

Values
0 10
1 20
2 30

✅ 从多个 Series 构建:

series1 = pd.Series([1, 2, 3], name='A')
series2 = pd.Series(['x', 'y', 'z'], name='B')
df_multi_series = pd.DataFrame({'col_a': series1, 'col_b': series2})
print(df_multi_series)

col_a col_b
0 1 x
1 2 y
2 3 z

3.5 从其他 DataFrame 构造(复制、转换)

直接复制

original_df = pd.DataFrame({'x': [1, 2], 'y': [3, 4]})
copied_df = pd.DataFrame(original_df, copy=True)

使用索引筛选部分数据重新构建

sub_df = pd.DataFrame(original_df.loc[original_df['x'] > 1])

3.6 从文件读取+构造 DataFrame

虽然这不是严格意义上的构造函数调用,但是最常见的实际工作方式:

# Read CSV -> DataFrame
csv_df = pd.read_csv('data.csv')
# Read JSON -> DataFrame
json_df = pd.read_json('data.json')
# Read SQL query -> DataFrame
sql_df = pd.read_sql('SELECT * FROM my_table', connection)

这些函数本质上也是调用了 DataFrame 构造器。

四、高级参数应用技巧

4.1 指定统一的数据类型

df_typed = pd.DataFrame(data_dict, dtype='float64')
print(df_typed.dtypes)

结果将是:

姓名 object
年龄 float64
收入 float64
dtype: object

还可以针对不同列设置类型:

df_partial_dtypes = pd.DataFrame(data_dict).astype({
'年龄': 'int32',
'收入': 'float64'
})

4.2 设置索引与列名灵活控制

df_custom_index = pd.DataFrame(
data_list_rows,
index=pd.Index(['User1', 'User2', 'User3'], name='userId'),
columns=pd.Index(['name', 'age', 'income'], name='field')
)
print(df_custom_index)

4.3 保留原始输入对象(避免拷贝)

original_array = np.arange(9).reshape(3, 3)
df_view = pd.DataFrame(original_array, copy=False)
# 这时修改 df_view 可能会影响 original_array!

✅ 若输入是其他 DataFrame 或 ndarray,谨慎使用 copy=False!

五、特殊情况与错误处理

5.1 空 DataFrame

empty_df = pd.DataFrame()
print(empty_df.empty) # True

可以通过添加列和值来扩展:

empty_df['new_column'] = [1, 2, 3]

5.2 长度不一致导致 ValueError

try:
df_invalid = pd.DataFrame({
'A': [1, 2, 3],
'B': [4, 5] # 长度不对齐 → 会报错
})
except ValueError as e:
print(e) # All arrays must be of the same length

✅ 解决办法:保证所有输入列长度一致!

六、常见使用场景与技巧

场景

推荐做法

快速测试创建数据框

pd.DataFrame({‘A’: [1, 2], ‘B’: [3, 4]})

从已知二维数据构造表格

np.array + columns/index

构造带有列名的表格

始终显式传 columns

多列由不同数据源组成

字典 + Series 组合

读取外部数据转成 DataFrame

pd.read_xxx() + 构造器后续定制

七、性能考量与最佳实践

提议

缘由

尽可能批量导入

减少内存分配与复制频次

控制 copy 参数

数据量大时显著影响性能

合理使用 Series 替代 list/dict

更规范、易调试

避免频繁构造小 DataFrame 并合并

影响性能

明确指定列名与索引

提高可读性与防止运行时异常

八、完整构造函数示例:构建电商销售报表

import pandas as pd
import numpy as np
# 构造模拟销售数据
dates = pd.date_range('2024-01-01', periods=100, freq='D')
categories = np.random.choice(['电子', '服装', '家居'], size=100)
prices = np.round(np.random.uniform(10, 1000, size=100), 2)
quantities = np.random.randint(1, 20, size=100)
discounts = np.random.choice([0, 0.1, 0.2], size=100)
sales_df = pd.DataFrame({
'date': dates,
'category': categories,
'price': prices,
'quantity': quantities,
'discount': discounts
})
# 自动推导总销售额
sales_df['total'] = sales_df.eval('price * quantity * (1 – discount)')
# 查看前几行
print(sales_df.head())

九、小结

DataFrame 构造函数是 Pandas 系列数据结构中最重大、最常用的方法之一。它具备以下优势:

  • 支持数十种输入格式,适配各种业务背景
  • 提供灵活的元信息(索引、列名、类型)设置
  • 结构设计利于后续数据分析(groupby, merge, pivot)

熟练掌握如下构造方式将极大提升你在数据领域的开发效率:

dict > list > Series > array 为最佳实践顺序

© 版权声明

相关文章

1 条评论

  • 头像
    柯南探 投稿者

    收藏了,感谢分享

    无记录
    回复