python中关于数据结构DataFrame讲解

Pandas DataFrame详解
本文深入讲解了Pandas库中DataFrame的构建、检索、索引重置及索引对象的使用,包括通过字典构建DataFrame、数据检索技巧、索引重置方法及索引对象的应用。

DataFrame,顾名思义主要指的是矩阵。

#DataFrame
#DataFrame对象
"""
DataFrame在Pandas中用于表示矩阵数据
DataFrame包含了已排序的列集合
每一列可以是不同的值类型(数值、字符串、布尔值等)
DataFrame既有行索引index,也有列索引columns
DataFrame可以理解为一个共享相同索引的Series的字典
"""

#2、构建DataFrame
import pandas as pd
import numpy as np
data={'name':['A','B','B'],     
      'gender':['M','F','M'],     
      'age':[22,23,24]} 
c = pd.DataFrame(data) 
print(c)
"""
输出:
     name gender  age
0     A      M   22
1     B      F   23
2     C      M   24

"""
#用嵌套字典构建DataFrame
#嵌套字典构建DataFrame时,Pandas将字典的键做为列索引,将内部字典的键作为行进行索引
data= {'name':{1:'A',2:'B',3:'C'},     
     'gender':{1:'M',2:'F'},     
     'age':{1:22,2:23,3:24}}
c = pd.DataFrame(data)

#2、检索DataFrame
"""
若DataFrame数据量太大,可以用df.head()筛选出最前面的五行 
如df[‘name’](任意列名) 列名为属性,如df.name 
选择一行,可以使用属性loc返回一个Series对象。如df.loc[1],
索引的名字即为当前行的列索引“1” ,索引名字为各列的名字
"""

#3、重置索引

#重新索引方法reindex() 
d=pd.DataFrame(np.arange(9).reshape(3,3),
               index=['a','c','d '],
               columns=['one','two','four'])
print(d)
"""
    one  two  four
a     0    1     2
c     3    4     5
d     6    7     8

"""
#默认对行进行重新索引,如
e = d.reindex(['a','b','c','d'])
print(e)
"""
   one  two  four
a  0.0  1.0   2.0
b  NaN  NaN   NaN
c  3.0  4.0   5.0
d  NaN  NaN   NaN
"""
#可以同时对列和行进行索引,如 
e = d.reindex(index=['a','b','c','d'],
          columns=['one','two','three','four']) 
print(e)
"""
   one  two  three  four
a  0.0  1.0    NaN   2.0
b  NaN  NaN    NaN   NaN
c  3.0  4.0    NaN   5.0
d  NaN  NaN    NaN   NaN

"""
#缺失值自动用NaN填充 
#使用参数fill_value=n,用n代替缺失值

#4、索引对象
#索引对象用于存储轴标签和其他元数据
#用pd.index()生成索引对象,或从Series和DataFrame的行列索引 
labels=pd.index(np.arange(3)) 
labels=d.index
labels=d.columns 
f = pd.Series([1.3,-3.4,0], index = labels)
print(f)
"""
如果报错:AttributeError: module 'pandas' has no attribute 'index'

则是版本不对,旧的版本中pandas会有,不可以不练习此处,了解就好。

正确版本:pandas 0.19.2,在powershell 中输入pip install pandas=0.19.2
"""
<think> 我们正在讨论Python中将结果写入DataFrame方法。用户可能已经了解一些基础,但需要更全面的总结。 常见方法包括: 1. 直接使用字典创建DataFrame(适用于一次性写入) 2. 使用pandas.DataFrame.append()(但注意,从pandas 1.4.0开始,append已被弃用) 3. 使用列表收集数据,然后一次性创建DataFrame(高效方法) 4. 使用loc或iloc进行行或列赋值(适用于已知索引的情况) 5. 使用字典列表,然后转换为DataFrame 6. 使用concat函数(适用于合并多个DataFrame) 由于用户要求写入DataFrame,这里主要讨论如何将数据(可能是循环中的结果)写入DataFrame。 考虑到性能,通常建议避免在循环中逐行追加,而是先收集数据再创建DataFrame。 但为了全面性,我将介绍多种方法,并指出最佳实践。 注意:用户提到了“结果”,可能是某种计算的结果,我们假设这些结果是在循环中产生的,或者是已经收集好的数据。 我会按照以下结构回答: 1. 直接创建DataFrame(适用于数据已经完整) 2. 逐行添加(不推荐,但介绍方法,并说明为什么以及替代方案) 3. 使用列表收集再创建(推荐) 4. 使用concat(适用于合并多个DataFrame) 同时,我会在每个方法后给出简单示例。 另外,由于用户可能是在循环中产生数据,所以重点讲解循环中如何高效构建DataFrame。 最后,生成相关问题。 注意:我们使用pandas库,所以首先需要导入pandas。 </think> 在 Python 中将结果写入 DataFrame 主要有以下方法及最佳实践: ### 一、基础创建方法 1. **直接创建**(适合固定数据集) ```python import pandas as pd data = {'姓名': ['张三', '李四'], '年龄': [25, 30]} df = pd.DataFrame(data) ``` 2. **列表/字典转换**(适合结构化数据) ```python results = [{'A': 1, 'B': 2}, {'A': 3, 'B': 4}] df = pd.DataFrame.from_records(results) ``` ### 二、动态写入方法 3. **逐行追加**(适合小批量数据)⚠️ 性能较低 ```python df = pd.DataFrame(columns=['列1', '列2']) for i in range(3): df.loc[len(df)] = [i*10, i*20] # 按行追加 ``` 4. **批量追加**(推荐方案✅) 先收集数据再一次性创建: ```python rows = [] for i in range(1000): rows.append({'时间': i, '值': i**2}) df = pd.DataFrame(rows) # 高效创建 ``` ### 三、特殊场景处理 5. **从文件/数据库导入** ```python df = pd.read_csv('data.csv') # CSV文件 df = pd.read_sql('SELECT * FROM table', con) # SQL数据库 ``` 6. **合并多个DataFrame** ```python df_concat = pd.concat([df1, df2], ignore_index=True) ``` ### 四、性能优化建议 - 避免循环中逐行追加,优先使用批量创建 - 大数据集使用 `df = pd.DataFrame.from_dict(data)` 替代循环 - 处理超大数据时考虑分块写入: ```python chunks = [df_chunk1, df_chunk2] pd.concat(chunks).to_parquet('output.parquet') ``` ### 引用说明 Pandas 官方推荐优先使用批量操作而非逐行处理[^1],当数据量超过万行时,批量创建比逐行追加快 100 倍以上[^2]。 --- ### 📚 相关问题 1. 如何将多个 CSV 文件合并为一个 DataFrame? 2. 处理超大数据集(>100GB)时如何优化 DataFrame 内存占用? 3. DataFrame 写入 Excel 文件时如何设置格式和多个工作表? 4. 如何实现 DataFrame 与 SQL 数据库的双向实时同步? 5. 在 Jupyter Notebook 中如何实时可视化 DataFrame 的数据变化? [^1]: Pandas 官方文档《性能优化指南》 [^2]: McKinney, W. *Python for Data Analysis*. O'Reilly Media, 2022.
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值