1. Pandas数据分析入门:从零开始掌握Series和DataFrame
刚接触数据分析时,我被各种复杂的数据结构弄得晕头转向,直到发现了Pandas这个神器。作为Python数据分析的核心库,Pandas让数据处理变得像操作Excel表格一样直观。今天我就把自己学习Pandas的笔记整理出来,重点讲解Series和DataFrame这两种核心数据结构的使用技巧。
记得第一次处理销售数据时,我用纯Python写了上百行代码才完成简单的统计,而改用Pandas后,同样的工作只需几行代码。下面这些实战经验,希望能帮你少走弯路。
2. Series数据结构详解
2.1 创建Series的四种方式
Series是Pandas中最基础的一维数据结构,相当于带标签的数组。创建Series主要有以下四种方法:
python复制import pandas as pd
import numpy as np
# 方法1:从列表创建(默认整数索引)
basic_series = pd.Series([10, 20, 30, 40])
print(basic_series)
# 方法2:自定义索引标签
custom_index_series = pd.Series([10, 20, 30], index=['A', 'B', 'C'])
# 方法3:从字典创建(键自动转为索引)
data_dict = {'北京': 2154, '上海': 2428, '广州': 1490}
city_series = pd.Series(data_dict)
# 方法4:指定values和index(索引不匹配时产生NaN)
new_index = ['北京', '上海', '深圳']
resized_series = pd.Series(data_dict, index=new_index)
注意:方法4中,当提供的index与字典键不匹配时,未匹配的索引位置会自动填充NaN(Not a Number),这是Pandas表示缺失值的方式。
2.2 Series索引的进阶技巧
Series支持多种灵活的索引方式,这是它比普通NumPy数组强大的地方:
python复制# 创建示例Series
sales = pd.Series([120, 180, 150, 90],
index=['Q1', 'Q2', 'Q3', 'Q4'])
# 基础索引
print(sales['Q2']) # 输出: 180
# 切片索引(包含末端)
print(sales['Q2':'Q4']) # 输出: Q2-180, Q3-150, Q4-90
# 布尔索引
print(sales[sales > 150]) # 输出: Q2-180
# 位置索引(iloc)
print(sales.iloc[1]) # 输出: 180(Q2的值)
# 标签索引(loc)
print(sales.loc['Q3']) # 输出: 150
实际项目中,我经常遇到需要同时获取多个不连续数据点的情况,这时可以使用列表式索引:
python复制# 获取多季度数据
selected = sales[['Q1', 'Q3']]
2.3 标签操作与数据清洗
处理真实数据时,经常需要调整索引标签。需要注意的是,Pandas的索引是不可变对象,必须整体替换:
python复制# 错误示范(会报错)
# sales.index[0] = 'First Quarter'
# 正确做法:整体替换
sales.index = ['第一季度', '第二季度', '第三季度', '第四季度']
# 更安全的rename方法(创建副本)
new_sales = sales.rename({'第一季度': 'Q1_ZH'})
处理缺失数据是数据分析的常见任务,Pandas提供了多种处理方式:
python复制# 检测缺失值
print(resized_series.isnull())
# 填充缺失值
filled = resized_series.fillna(0)
# 删除缺失值
cleaned = resized_series.dropna()
3. DataFrame:二维数据分析利器
3.1 创建DataFrame的五种方法
DataFrame可以理解为由多个Series组成的表格数据。以下是常用的创建方法:
python复制# 方法1:从字典列表创建
data = [
{'产品': '手机', '销量': 120, '单价': 5999},
{'产品': '笔记本', '销量': 85, '单价': 8999},
{'产品': '平板', '销量': 150, '单价': 3999}
]
df1 = pd.DataFrame(data)
# 方法2:从字典创建(键作为列)
sales_data = {
'季度': ['Q1', 'Q2', 'Q3', 'Q4'],
'销售额': [120, 180, 150, 90],
'成本': [80, 120, 100, 60]
}
df2 = pd.DataFrame(sales_data)
# 方法3:从NumPy数组创建
arr = np.random.rand(4, 3)
df3 = pd.DataFrame(arr, columns=['A', 'B', 'C'])
# 方法4:从CSV文件读取
df4 = pd.read_csv('sales_data.csv')
# 方法5:从其他DataFrame创建
df5 = df2.copy()
3.2 DataFrame的索引与选择
DataFrame的索引比Series更复杂,因为它有行和列两个维度。以下是常用的数据选择方法:
python复制# 创建示例DataFrame
sales_df = pd.DataFrame({
'产品': ['手机', '笔记本', '平板', '耳机'],
'Q1销量': [120, 85, 150, 200],
'Q2销量': [150, 90, 180, 210],
'单价': [5999, 8999, 3999, 999]
}, index=['A001', 'A002', 'A003', 'A004'])
# 选择单列(返回Series)
print(sales_df['产品'])
# 选择多列
print(sales_df[['产品', 'Q1销量']])
# 使用loc按标签选择
print(sales_df.loc['A001', '产品']) # 单个值
print(sales_df.loc['A001':'A003', ['产品', 'Q1销量']]) # 切片
# 使用iloc按位置选择
print(sales_df.iloc[1:3, 0:2]) # 第2-3行,第1-2列
# 布尔索引
print(sales_df[sales_df['Q1销量'] > 100])
3.3 数据操作与清洗技巧
在实际业务中,DataFrame的数据操作非常频繁:
python复制# 添加新列
sales_df['Q1销售额'] = sales_df['Q1销量'] * sales_df['单价']
# 修改数据
sales_df.loc['A001', 'Q1销量'] = 130
# 删除列
del sales_df['Q2销量']
# 或
sales_df.drop('单价', axis=1, inplace=True)
# 删除行
sales_df.drop('A004', inplace=True)
# 处理缺失值
sales_df.fillna(0, inplace=True) # 填充
sales_df.dropna(inplace=True) # 删除
4. 数据统计与分析方法
4.1 描述性统计
Pandas内置了丰富的统计方法:
python复制# 基本统计量
print(sales_df.describe())
# 单列统计
print(sales_df['Q1销量'].mean()) # 平均值
print(sales_df['Q1销量'].max()) # 最大值
print(sales_df['Q1销量'].std()) # 标准差
# 相关性分析
print(sales_df.corr())
4.2 排序与排名
python复制# 按单列排序
sorted_df = sales_df.sort_values('Q1销量', ascending=False)
# 按多列排序
sorted_df = sales_df.sort_values(['单价', 'Q1销量'], ascending=[True, False])
# 计算排名
sales_df['销量排名'] = sales_df['Q1销量'].rank(ascending=False)
4.3 应用自定义函数
apply方法可以让你对DataFrame应用任何函数:
python复制# 对每列应用函数
print(sales_df.apply(lambda x: x.max() - x.min()))
# 对每行应用函数
def calculate_profit(row):
return row['Q1销量'] * (row['单价'] - 2000)
sales_df['利润'] = sales_df.apply(calculate_profit, axis=1)
5. 实战经验与常见问题
5.1 性能优化技巧
处理大型数据集时,这些技巧可以显著提升性能:
- 使用向量化操作代替循环
- 避免链式赋值(如df[df['A']>0]['B'] = 1)
- 使用astype()转换数据类型节省内存
- 考虑使用eval()进行复杂表达式计算
5.2 常见错误排查
- SettingWithCopyWarning警告:通常是因为对DataFrame切片直接赋值,应使用loc明确指定
- 索引错误:检查是否混淆了loc(标签)和iloc(位置)索引
- 数据类型问题:使用dtypes查看列类型,必要时用astype转换
5.3 实际项目建议
- 处理数据前先用head()查看前几行
- 使用info()了解数据概况和内存使用
- 重要操作前备份数据(df_backup = df.copy())
- 逐步验证数据转换结果
掌握这些Pandas基础操作后,你已经可以处理大多数常规数据分析任务了。建议从实际项目入手,比如分析销售数据或用户行为数据,在实践中深化理解。当遇到问题时,Pandas的官方文档和Stack Overflow社区通常能找到解决方案。