Pandas基础:Series、DataFrame与数据读取
Pandas基础:Series、DataFrame与数据读取
Pandas是Python中最流行的数据分析库,提供了高效、灵活的数据结构来处理结构化数据。本文将介绍Pandas的核心概念和基础操作。
Series:一维带标签数组
Series是Pandas的一维数据结构,类似于带索引的字典或NumPy数组:
import pandas as pd
import numpy as np
# 从列表创建Series
s = pd.Series([10, 20, 30, 40, 50])
print(s)
# 0 10
# 1 20
# 2 30
# 3 40
# 4 50
# 自定义索引
s = pd.Series([85, 90, 78], index=['数学', '英语', '物理'])
print(s['数学']) # 85
print(s['数学', '英语'](/notes/-)) # 数学 85, 英语 90
# 从字典创建
data = {'北京': 2189, '上海': 2487, '广州': 1868}
population = pd.Series(data, name='人口(万)')
print(population)
print(f"上海人口: {population['上海']}万")
# Series运算
print(s + 10) # 每个元素加10
print(s > 80) # 布尔判断
print(s.describe()) # 统计摘要
DataFrame:二维表格结构
DataFrame是Pandas的核心数据结构,类似于Excel表格或SQL表:
import pandas as pd
# 从字典创建DataFrame
data = {
'姓名': ['张三', '李四', '王五', '赵六'],
'年龄': [25, 30, 35, 28],
'部门': ['技术', '销售', '技术', '市场'],
'薪资': [15000, 12000, 18000, 13000]
}
df = pd.DataFrame(data)
print(df)
# 姓名 年龄 部门 薪资
# 0 张三 25 技术 15000
# 1 李四 30 销售 12000
# 2 王五 35 技术 18000
# 3 赵六 28 市场 13000
# 查看基本信息
print(f"形状: {df.shape}") # (4, 4)
print(f"列名: {df.columns.tolist()}") # ['姓名', '年龄', '部门', '薪资']
print(df.dtypes) # 数据类型
print(df.info()) # 完整信息摘要
读取数据
Pandas支持多种数据格式的读取:
import pandas as pd
# 读取CSV文件
df = pd.read_csv('data.csv')
df = pd.read_csv('data.csv', encoding='utf-8', index_col=0)
# 读取Excel文件
df = pd.read_excel('data.xlsx', sheet_name='Sheet1')
# 读取JSON文件
df = pd.read_json('data.json')
# 读取SQL(需要数据库连接)
# import sqlite3
# conn = sqlite3.connect('database.db')
# df = pd.read_sql('SELECT * FROM users', conn)
# 读取HTML表格
# df = pd.read_html('https://example.com')[0]
# 保存数据
df.to_csv('output.csv', index=False, encoding='utf-8-sig')
df.to_excel('output.xlsx', index=False)
df.to_json('output.json', force_ascii=False, indent=2)
数据选择
DataFrame提供了多种数据选择方式:
import pandas as pd
df = pd.DataFrame({
'姓名': ['张三', '李四', '王五'],
'年龄': [25, 30, 35],
'部门': ['技术', '销售', '技术'],
'薪资': [15000, 12000, 18000]
})
# 选择列
print(df['姓名']) # 返回Series
print(df['姓名', '年龄'](/notes/-)) # 返回DataFrame
# 选择行
print(df.iloc[0]) # 第一行(位置索引)
print(df.loc[0]) # 第一行(标签索引)
print(df.iloc[0:2]) # 前两行
# 条件筛选
tech_dept = df[df['部门'] == '技术']
print(tech_dept)
# 多条件筛选
result = df[(df['部门'] == '技术') & (df['年龄'] > 25)]
print(result)
# 查询语法
result = df.query('薪资 > 13000 and 部门 == "技术"')
print(result)
数据查看与统计
import pandas as pd
# 创建示例数据
df = pd.DataFrame({
'产品': ['A', 'B', 'A', 'B', 'A', 'C'],
'销量': [100, 150, 120, 130, 110, 200],
'价格': [10, 15, 10, 15, 10, 20]
})
# 查看前几行
print(df.head())
# 统计摘要
print(df.describe())
# 数值列统计
print(f"销量均值: {df['销量'].mean():.1f}")
print(f"销量中位数: {df['销量'].median()}")
print(f"销量标准差: {df['销量'].std():.1f}")
print(f"最高销量: {df['销量'].max()}")
# 分类列统计
print(df['产品'].value_counts())
# 唯一值
print(f"产品种类: {df['产品'].unique()}")
print(f"产品数量: {df['产品'].nunique()}")
数据修改
import pandas as pd
df = pd.DataFrame({
'姓名': ['张三', '李四', '王五'],
'年龄': [25, 30, 35],
'部门': ['技术', '销售', '技术']
})
# 添加新列
df['薪资'] = [15000, 12000, 18000]
df['年龄_年后'] = df['年龄'] + 1
# 删除列
df_dropped = df.drop(columns=['年龄_年后'])
# 重命名列
df_renamed = df.rename(columns={'姓名': '员工姓名', '部门': '所属部门'})
# 修改值
df.loc[df['姓名'] == '李四', '薪资'] = 15000
# 条件赋值
df['薪资等级'] = '普通'
df.loc[df['薪资'] >= 18000, '薪资等级'] = '高级'
print(df)
处理缺失值
import pandas as pd
import numpy as np
# 创建包含缺失值的数据
df = pd.DataFrame({
'姓名': ['张三', '李四', '王五', '赵六'],
'年龄': [25, np.nan, 35, 28],
'部门': ['技术', '销售', None, '市场'],
'薪资': [15000, 12000, np.nan, 13000]
})
# 检查缺失值
print(df.isnull().sum())
# 删除包含缺失值的行
df_dropped = df.dropna()
# 删除特定列包含缺失值的行
df_dropped2 = df.dropna(subset=['年龄'])
# 填充缺失值
df_filled = df.copy()
df_filled['年龄'] = df_filled['年龄'].fillna(df['年龄'].mean())
df_filled['部门'] = df_filled['部门'].fillna('未知')
df_filled['薪资'] = df_filled['薪资'].fillna(0)
print(df_filled)
实战:销售数据分析
import pandas as pd
# 创建销售数据
sales = pd.DataFrame({
'日期': ['2024-01-01', '2024-01-02', '2024-01-01', '2024-01-02'],
'产品': ['手机', '手机', '电脑', '电脑'],
'销量': [50, 60, 20, 25],
'单价': [3000, 3000, 8000, 8000]
})
# 计算销售额
sales['销售额'] = sales['销量'] * sales['单价']
print(sales)
# 按产品汇总
product_summary = sales.groupby('产品')['销售额'].sum()
print("\n产品销售额汇总:")
print(product_summary)
# 按日期汇总
daily_summary = sales.groupby('日期')['销售额'].sum()
print("\n每日销售额:")
print(daily_summary)
总结
Pandas的Series和DataFrame是数据分析的核心工具。熟练掌握数据读取、选择、修改和基本统计操作,将为后续的数据清洗、分析和可视化奠定坚实基础。多练习真实数据集,逐步提升数据处理能力。