大家好,我是正在实战各种AI项目 的程序员晚枫。
今天学习Pandas的数据读写功能 。
在实际工作中,数据可能来自各种地方:Excel表格、CSV文件、数据库、API接口。掌握数据的导入导出,是数据分析的第一步。
读取CSV文件 CSV是最常见的数据格式,纯文本,兼容性好。
基础读取 1 2 3 4 5 6 7 import pandas as pddf = pd.read_csv('data.csv' ) print (df.head())
常用参数 1 2 3 4 5 6 7 8 9 10 df = pd.read_csv('data.csv' , encoding='utf-8' , sep=',' , header=0 , index_col=0 , usecols=['A' , 'B' , 'C' ], nrows=1000 , skiprows=2 , na_values=['NA' , 'NULL' , '-' ] )
中文编码问题 1 2 3 4 df = pd.read_csv('data.csv' , encoding='gbk' ) df = pd.read_csv('data.csv' , encoding='utf-8-sig' ) df = pd.read_csv('data.csv' , encoding='latin1' )
读取Excel文件 安装依赖 1 pip install openpyxl xlrd
基础读取 1 2 3 4 5 6 7 8 9 10 df = pd.read_excel('data.xlsx' ) df = pd.read_excel('data.xlsx' , sheet_name='Sheet1' ) df = pd.read_excel('data.xlsx' , sheet_name=0 ) all_sheets = pd.read_excel('data.xlsx' , sheet_name=None )
常用参数 1 2 3 4 5 6 7 8 9 df = pd.read_excel('data.xlsx' , sheet_name='销售数据' , header=0 , skiprows=1 , nrows=100 , usecols='A:C' , usecols=[0 , 1 , 2 ], dtype={'列名' : str } )
保存数据 保存为CSV 1 2 3 4 5 6 7 8 9 10 11 12 df.to_csv('output.csv' , index=False ) df.to_csv('output.csv' , index=False , encoding='utf-8-sig' , sep=',' , float_format='%.2f' , columns=['A' , 'B' ], mode='w' )
保存为Excel 1 2 3 4 5 6 7 8 df.to_excel('output.xlsx' , index=False ) with pd.ExcelWriter('output.xlsx' ) as writer: df1.to_excel(writer, sheet_name='Sheet1' , index=False ) df2.to_excel(writer, sheet_name='Sheet2' , index=False ) df3.to_excel(writer, sheet_name='Sheet3' , index=False )
读取其他格式 JSON 1 2 3 4 5 6 7 8 df = pd.read_json('data.json' ) import jsonwith open ('data.json' , 'r' ) as f: data = json.load(f) df = pd.json_normalize(data)
SQL数据库 1 2 3 4 5 6 7 8 9 10 11 12 13 from sqlalchemy import create_engineengine = create_engine('mysql+pymysql://user:password@host:port/database' ) df = pd.read_sql('SELECT * FROM table_name' , engine) df = pd.read_sql_table('table_name' , engine) df = pd.read_sql_query('SELECT * FROM table WHERE age > 18' , engine) df.to_sql('new_table' , engine, if_exists='replace' , index=False )
大数据分块读取 1 2 3 4 5 6 chunks = pd.read_csv('big_file.csv' , chunksize=10000 ) for chunk in chunks: process(chunk)
实战:批量处理Excel报表 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 import pandas as pdimport globall_files = glob.glob("sales/*.xlsx" ) all_data = [] for file in all_files: df = pd.read_excel(file) df['来源文件' ] = file all_data.append(df) combined = pd.concat(all_data, ignore_index=True ) monthly_sales = combined.groupby('月份' )['销售额' ].sum () with pd.ExcelWriter('汇总报告.xlsx' ) as writer: combined.to_excel(writer, sheet_name='原始数据' , index=False ) monthly_sales.to_excel(writer, sheet_name='月度汇总' ) print (f"处理了{len (all_files)} 个文件,共{len (combined)} 条记录" )
性能对比:不同读取方式的速度 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 import pandas as pdimport numpy as npimport timedf = pd.DataFrame({ 'id' : range (100000 ), 'value' : np.random.randn(100000 ), 'category' : np.random.choice(['A' , 'B' , 'C' ], 100000 ), 'date' : pd.date_range('2024-01-01' , periods=100000 , freq='5min' ) }) df.to_csv('test.csv' , index=False ) df.to_parquet('test.parquet' , index=False ) df.to_feather('test.feather' , index=False ) start = time.time() df_csv = pd.read_csv('test.csv' ) print (f"CSV: {time.time()-start:.3 f} 秒" )start = time.time() df_par = pd.read_parquet('test.parquet' ) print (f"Parquet: {time.time()-start:.3 f} 秒" )start = time.time() df_fea = pd.read_feather('test.feather' ) print (f"Feather: {time.time()-start:.3 f} 秒" )
格式 读取速度 文件大小 适用场景 CSV 慢 大 通用交换格式 Excel 很慢 很大 给老板看 Parquet 快 小 大数据存储 Feather 最快 中 临时中间文件 JSON 慢 大 API数据
进阶用法 大文件分块读取 1 2 3 4 5 6 7 8 9 10 11 chunk_size = 50000 results = [] for chunk in pd.read_csv('huge_file.csv' , chunksize=chunk_size): processed = chunk.groupby('category' )['value' ].sum () results.append(processed) final = pd.concat(results).groupby(level=0 ).sum ()
读取数据库 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 from sqlalchemy import create_engineengine = create_engine('mysql+pymysql://user:password@localhost:3306/mydb' ) df = pd.read_sql('SELECT * FROM users' , engine) df = pd.read_sql(''' SELECT city, COUNT(*) as cnt, AVG(age) as avg_age FROM users WHERE register_date > '2025-01-01' GROUP BY city ''' , engine)df.to_sql('analysis_result' , engine, if_exists='replace' , index=False )
读取网页表格 1 2 3 4 5 url = 'https://en.wikipedia.org/wiki/List_of_countries_by_GDP_(nominal)' tables = pd.read_html(url) gdp_df = tables[2 ] print (gdp_df.head())
避坑指南 ❌ 坑1:CSV中文乱码 1 2 3 4 5 6 7 8 9 10 11 12 13 14 df = pd.read_csv('data.csv' , encoding='utf-8' ) df = pd.read_csv('data.csv' , encoding='gbk' ) df = pd.read_csv('data.csv' , encoding='gb2312' ) df = pd.read_csv('data.csv' , encoding='gb18030' ) import chardetwith open ('data.csv' , 'rb' ) as f: result = chardet.detect(f.read()) print (f"检测到编码: {result['encoding' ]} " )df = pd.read_csv('data.csv' , encoding=result['encoding' ])
❌ 坑2:Excel日期解析错误 1 2 3 4 5 6 7 8 df = pd.read_excel('data.xlsx' ) df['date' ] = pd.to_datetime('1899-12-30' ) + pd.to_timedelta(df['date' ], unit='D' ) df = pd.read_excel('data.xlsx' , parse_dates=['order_date' , 'ship_date' ])
❌ 坑3:读取时列名有空格 1 2 3 4 5 6 7 df = pd.read_csv('data.csv' ) print (df.columns) df.columns = df.columns.str .strip().str .lower().str .replace(' ' , '_' ) print (df.columns)
实战案例:从多个数据源整合电商数据 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 import pandas as pdimport numpy as nporders = pd.read_csv('orders.csv' , parse_dates=['order_date' ]) users = pd.read_excel('users.xlsx' , sheet_name='活跃用户' ) products = pd.read_json('products.json' ) from sqlalchemy import create_engineengine = create_engine('sqlite:///inventory.db' ) inventory = pd.read_sql('SELECT * FROM stock' , engine) df = orders.merge(users, on='user_id' , how='left' ) df = df.merge(products[['product_id' , 'category' , 'price' ]], on='product_id' , how='left' ) df.to_csv('integrated_data.csv' , index=False , encoding='utf-8-sig' ) df.to_parquet('integrated_data.parquet' , index=False ) df.to_excel('report.xlsx' , sheet_name='整合数据' , index=False ) print (f"整合完成!共{len (df)} 条记录,{len (df.columns)} 个字段" )
下节预告 下一课我们将学习数据筛选与查询 ,这是数据分析的核心技能。
👉 继续阅读:数据筛选与查询
💬 加入学习交流群 扫码加入Python学习交流群 ,和数千名同学一起进步:
👉 点击加入交流群
群里不定期分享:
数据分析实战案例 Python学习资料 求职面试经验 行业最新动态 推荐:AI Python数据分析实战营 🎁 限时福利 :送《利用Python进行数据分析》实体书
👉 点击了解详情
课程导航 上一篇: Pandas入门-Series和DataFrame
下一篇: 数据筛选与查询
PS:数据的导入导出是分析的第一步。熟练掌握这些操作,能帮你节省大量时间。
📚 推荐教材 主教材 :《Excel+Python 飞速搞定数据分析与处理(图灵出品)》
💬 联系我 主营业务 :AI 编程培训、企业内训、技术咨询
🎓 AI 编程实战课程 想系统学习 AI 编程?程序员晚枫的 AI 编程实战课 帮你从零上手!