数据分析:Pandas与数据清洗实战
数据分析:Pandas与数据清洗实战
大家好,我是欧阳瑞(Rich Own)。今天想和大家聊聊数据分析这个话题。作为一个全栈开发者,我经常需要处理各种数据。Pandas是Python中最流行的数据处理库,今天就来分享一下Pandas的使用技巧和数据清洗实战经验。
为什么选择Pandas?
Pandas是一个强大的数据处理和分析库,提供了:
- 高效的数据结构(DataFrame和Series)
- 强大的数据清洗能力
- 灵活的数据操作
- 丰富的统计功能
安装Pandas
pip install pandas pip install numpy matplotlib seaborn数据结构基础
Series
import pandas as pd import numpy as np # 创建Series s = pd.Series([1, 3, 5, np.nan, 6, 8]) print(s) # 索引 s.index = ['a', 'b', 'c', 'd', 'e', 'f'] # 访问元素 print(s['a']) print(s[0])DataFrame
# 创建DataFrame data = { 'Name': ['Alice', 'Bob', 'Charlie', 'David'], 'Age': [25, 30, 35, 40], 'City': ['New York', 'London', 'Paris', 'Tokyo'] } df = pd.DataFrame(data) print(df) # 查看数据 print(df.head()) print(df.tail()) print(df.info()) print(df.describe())数据读取
# 读取CSV df = pd.read_csv('data.csv') # 读取Excel df = pd.read_excel('data.xlsx', sheet_name='Sheet1') # 读取JSON df = pd.read_json('data.json') # 读取数据库 import sqlite3 conn = sqlite3.connect('database.db') df = pd.read_sql('SELECT * FROM table', conn)数据清洗实战
处理缺失值
# 查看缺失值 print(df.isnull().sum()) # 删除缺失值 df_clean = df.dropna() # 填充缺失值 df['Age'].fillna(df['Age'].mean(), inplace=True) df['City'].fillna('Unknown', inplace=True) # 向前填充/向后填充 df.fillna(method='ffill', inplace=True) df.fillna(method='bfill', inplace=True)处理重复值
# 查找重复值 print(df.duplicated()) # 删除重复值 df.drop_duplicates(inplace=True)数据类型转换
# 转换为字符串 df['Name'] = df['Name'].astype(str) # 转换为日期 df['Date'] = pd.to_datetime(df['Date']) # 转换为数值 df['Price'] = pd.to_numeric(df['Price'], errors='coerce')数据过滤
# 基本过滤 filtered = df[df['Age'] > 30] # 多条件过滤 filtered = df[(df['Age'] > 30) & (df['City'] == 'London')] # 使用query方法 filtered = df.query('Age > 30 and City == "London"')数据转换
# 使用apply df['UpperName'] = df['Name'].apply(str.upper) # 使用map city_map = {'New York': 'NY', 'London': 'LDN'} df['CityCode'] = df['City'].map(city_map) # 使用replace df['City'] = df['City'].replace({'New York': 'NYC'})数据聚合
# 分组统计 grouped = df.groupby('City')['Age'].mean() # 多列聚合 grouped = df.groupby('City').agg({ 'Age': ['mean', 'max', 'min'], 'Name': 'count' }) # 透视表 pivot = df.pivot_table(values='Age', index='City', aggfunc='mean')实战案例:电商数据分析
# 加载数据 df = pd.read_csv('ecommerce_data.csv') # 数据探索 print(df.shape) print(df.columns) print(df.dtypes) print(df.isnull().sum()) # 数据清洗 df['order_date'] = pd.to_datetime(df['order_date']) df['total_amount'] = pd.to_numeric(df['total_amount'], errors='coerce') df['total_amount'].fillna(df['total_amount'].mean(), inplace=True) df.drop_duplicates(inplace=True) # 添加新特征 df['month'] = df['order_date'].dt.month df['year'] = df['order_date'].dt.year df['day_of_week'] = df['order_date'].dt.dayofweek # 分析 monthly_sales = df.groupby('month')['total_amount'].sum() category_sales = df.groupby('category')['total_amount'].sum() customer_purchases = df.groupby('customer_id')['total_amount'].sum().sort_values(ascending=False) # 可视化 import matplotlib.pyplot as plt import seaborn as sns plt.figure(figsize=(12, 6)) monthly_sales.plot(kind='bar') plt.title('Monthly Sales') plt.xlabel('Month') plt.ylabel('Total Amount') plt.show()高级技巧
合并数据
# 合并DataFrame df1 = pd.DataFrame({'key': ['A', 'B', 'C'], 'value1': [1, 2, 3]}) df2 = pd.DataFrame({'key': ['B', 'C', 'D'], 'value2': [4, 5, 6]}) # 内连接 merged = pd.merge(df1, df2, on='key') # 左连接 merged = pd.merge(df1, df2, on='key', how='left') # 右连接 merged = pd.merge(df1, df2, on='key', how='right') # 外连接 merged = pd.merge(df1, df2, on='key', how='outer')时间序列分析
# 创建时间序列 dates = pd.date_range('2023-01-01', periods=100, freq='D') ts = pd.Series(np.random.randn(100), index=dates) # 移动窗口 rolling = ts.rolling(window=7).mean() # 差分 diff = ts.diff() # 重采样 weekly = ts.resample('W').sum()性能优化
# 使用dtypes减少内存 df['Age'] = df['Age'].astype('int8') df['Score'] = df['Score'].astype('float32') # 使用query代替loc result = df.query('Age > 30') # 使用vectorized操作 df['Total'] = df['Price'] * df['Quantity'] # 使用Categorical类型 df['Category'] = df['Category'].astype('category')数据导出
# 导出CSV df.to_csv('cleaned_data.csv', index=False) # 导出Excel df.to_excel('cleaned_data.xlsx', sheet_name='Data') # 导出JSON df.to_json('cleaned_data.json') # 导出到数据库 conn = sqlite3.connect('database.db') df.to_sql('cleaned_data', conn, if_exists='replace')总结
Pandas是数据分析的利器,掌握它可以大大提高数据处理的效率。从数据读取到清洗,再到分析和可视化,Pandas都能胜任。
我的鬃狮蜥Hash对数据分析也有自己的理解——它总是根据蟋蟀的大小来决定捕食策略,这也许就是自然界的"数据驱动决策"吧!
如果你对数据分析感兴趣,欢迎留言交流!我是欧阳瑞,极客之路,永无止境!
技术栈:Python · Pandas · NumPy · Matplotlib
