Pandas数据处理¶
问题169:什么是Pandas?如何安装Pandas?¶
Pandas是Python中用于数据分析和处理的重要库,提供了强大的数据结构和数据分析工具:
# 安装Pandas
# pip install pandas
# 导入Pandas
import pandas as pd
# 创建Series
s = pd.Series([1, 2, 3, 4, 5])
print(s)
# 创建DataFrame
df = pd.DataFrame({
'A': [1, 2, 3, 4],
'B': [5, 6, 7, 8],
'C': [9, 10, 11, 12]
})
print(df)
问题170:如何创建和操作DataFrame?¶
import pandas as pd
# 1. 从字典创建DataFrame
data = {
'姓名': ['张三', '李四', '王五', '赵六'],
'年龄': [25, 30, 35, 28],
'城市': ['北京', '上海', '广州', '深圳'],
'工资': [8000, 12000, 15000, 10000]
}
df = pd.DataFrame(data)
print(df)
# 2. 从列表创建DataFrame
data_list = [
['张三', 25, '北京', 8000],
['李四', 30, '上海', 12000],
['王五', 35, '广州', 15000],
['赵六', 28, '深圳', 10000]
]
columns = ['姓名', '年龄', '城市', '工资']
df2 = pd.DataFrame(data_list, columns=columns)
print(df2)
# 3. 基本操作
print(df.shape) # 形状
print(df.columns) # 列名
print(df.index) # 索引
print(df.dtypes) # 数据类型
print(df.info()) # 详细信息
print(df.describe()) # 统计描述
问题171:如何读取和写入数据?¶
import pandas as pd
# 1. 读取CSV文件
df = pd.read_csv('data.csv')
print(df.head()) # 显示前5行
# 2. 读取Excel文件
df_excel = pd.read_excel('data.xlsx', sheet_name='Sheet1')
print(df_excel.head())
# 3. 读取JSON文件
df_json = pd.read_json('data.json')
print(df_json.head())
# 4. 写入CSV文件
df.to_csv('output.csv', index=False)
# 5. 写入Excel文件
df.to_excel('output.xlsx', sheet_name='Sheet1', index=False)
# 6. 写入JSON文件
df.to_json('output.json', orient='records')
# 7. 读取带分隔符的文件
df_tsv = pd.read_csv('data.tsv', sep='\t')
print(df_tsv.head())
问题172:如何进行数据选择和过滤?¶
import pandas as pd
# 创建示例数据
data = {
'姓名': ['张三', '李四', '王五', '赵六', '钱七'],
'年龄': [25, 30, 35, 28, 32],
'城市': ['北京', '上海', '广州', '深圳', '北京'],
'工资': [8000, 12000, 15000, 10000, 11000]
}
df = pd.DataFrame(data)
# 1. 选择列
print(df['姓名']) # 选择单列
print(df[['姓名', '年龄']]) # 选择多列
# 2. 选择行
print(df.iloc[0]) # 选择第一行
print(df.iloc[0:3]) # 选择前3行
print(df.loc[0:2]) # 选择前3行(包含结束行)
# 3. 条件过滤
print(df[df['年龄'] > 30]) # 年龄大于30
print(df[df['城市'] == '北京']) # 城市为北京
print(df[(df['年龄'] > 25) & (df['工资'] > 10000)]) # 复合条件
# 4. 使用query方法
print(df.query('年龄 > 30 and 工资 > 10000'))
# 5. 使用isin方法
print(df[df['城市'].isin(['北京', '上海'])])
问题173:如何进行数据清洗?¶
import pandas as pd
import numpy as np
# 创建包含缺失值的数据
data = {
'姓名': ['张三', '李四', '王五', '赵六', '钱七'],
'年龄': [25, 30, np.nan, 28, 32],
'城市': ['北京', '上海', '广州', np.nan, '北京'],
'工资': [8000, 12000, 15000, 10000, np.nan]
}
df = pd.DataFrame(data)
# 1. 检查缺失值
print(df.isnull()) # 检查缺失值
print(df.isnull().sum()) # 统计缺失值数量
# 2. 删除缺失值
df_dropna = df.dropna() # 删除包含缺失值的行
print(df_dropna)
# 3. 填充缺失值
df_fillna = df.fillna({'年龄': df['年龄'].mean(), '工资': df['工资'].median()})
print(df_fillna)
# 4. 删除重复值
df_duplicated = df.drop_duplicates()
print(df_duplicated)
# 5. 数据类型转换
df['年龄'] = df['年龄'].astype(int)
print(df.dtypes)
# 6. 字符串处理
df['姓名'] = df['姓名'].str.upper()
print(df)
问题174:如何进行数据分组和聚合?¶
import pandas as pd
# 创建示例数据
data = {
'部门': ['技术部', '销售部', '技术部', '销售部', '技术部', '销售部'],
'姓名': ['张三', '李四', '王五', '赵六', '钱七', '孙八'],
'工资': [8000, 12000, 15000, 10000, 11000, 13000],
'奖金': [2000, 3000, 4000, 2500, 2800, 3200]
}
df = pd.DataFrame(data)
# 1. 基本分组
grouped = df.groupby('部门')
print(grouped.groups) # 显示分组信息
# 2. 分组聚合
print(grouped['工资'].sum()) # 按部门求和
print(grouped['工资'].mean()) # 按部门求平均
print(grouped['工资'].max()) # 按部门求最大值
print(grouped['工资'].min()) # 按部门求最小值
# 3. 多列聚合
print(grouped[['工资', '奖金']].sum())
# 4. 自定义聚合函数
def custom_agg(x):
return x.max() - x.min()
print(grouped['工资'].agg(custom_agg))
# 5. 多重分组
df['年份'] = [2023, 2023, 2024, 2024, 2023, 2024]
multi_grouped = df.groupby(['部门', '年份'])
print(multi_grouped['工资'].sum())
问题175:如何进行数据合并和连接?¶
import pandas as pd
# 创建示例数据
df1 = pd.DataFrame({
'ID': [1, 2, 3, 4],
'姓名': ['张三', '李四', '王五', '赵六'],
'部门': ['技术部', '销售部', '技术部', '销售部']
})
df2 = pd.DataFrame({
'ID': [1, 2, 3, 5],
'工资': [8000, 12000, 15000, 10000],
'奖金': [2000, 3000, 4000, 2500]
})
# 1. 内连接
inner_join = pd.merge(df1, df2, on='ID', how='inner')
print(inner_join)
# 2. 左连接
left_join = pd.merge(df1, df2, on='ID', how='left')
print(left_join)
# 3. 右连接
right_join = pd.merge(df1, df2, on='ID', how='right')
print(right_join)
# 4. 外连接
outer_join = pd.merge(df1, df2, on='ID', how='outer')
print(outer_join)
# 5. 纵向合并
df3 = pd.DataFrame({
'ID': [5, 6],
'姓名': ['钱七', '孙八'],
'部门': ['技术部', '销售部']
})
vertical_merge = pd.concat([df1, df3], ignore_index=True)
print(vertical_merge)
# 6. 横向合并
horizontal_merge = pd.concat([df1, df2], axis=1)
print(horizontal_merge)
问题176:如何进行数据透视和重塑?¶
import pandas as pd
# 创建示例数据
data = {
'日期': ['2023-01-01', '2023-01-01', '2023-01-02', '2023-01-02'],
'产品': ['A', 'B', 'A', 'B'],
'销售额': [1000, 1500, 1200, 1800],
'数量': [10, 15, 12, 18]
}
df = pd.DataFrame(data)
# 1. 数据透视表
pivot_table = df.pivot_table(
values='销售额',
index='日期',
columns='产品',
aggfunc='sum'
)
print(pivot_table)
# 2. 多重聚合
pivot_multi = df.pivot_table(
values=['销售额', '数量'],
index='日期',
columns='产品',
aggfunc={'销售额': 'sum', '数量': 'mean'}
)
print(pivot_multi)
# 3. 数据重塑
df_melted = df.melt(
id_vars=['日期', '产品'],
value_vars=['销售额', '数量'],
var_name='指标',
value_name='数值'
)
print(df_melted)
# 4. 数据转置
df_transposed = df.set_index(['日期', '产品']).T
print(df_transposed)
问题177:如何进行时间序列处理?¶
import pandas as pd
import numpy as np
# 1. 创建时间序列
dates = pd.date_range('2023-01-01', periods=10, freq='D')
ts = pd.Series(np.random.randn(10), index=dates)
print(ts)
# 2. 时间索引操作
print(ts['2023-01-01']) # 选择特定日期
print(ts['2023-01']) # 选择特定月份
print(ts['2023-01-01':'2023-01-05']) # 选择日期范围
# 3. 时间重采样
ts_resampled = ts.resample('W').mean() # 按周重采样
print(ts_resampled)
# 4. 时间偏移
ts_shifted = ts.shift(1) # 向前偏移1天
print(ts_shifted)
# 5. 时间差计算
ts_diff = ts.diff() # 计算差分
print(ts_diff)
# 6. 滚动窗口
ts_rolling = ts.rolling(window=3).mean() # 3天滚动平均
print(ts_rolling)
问题178:Pandas的实际应用场景¶
import pandas as pd
import numpy as np
# 1. 销售数据分析
def analyze_sales_data():
# 创建销售数据
sales_data = {
'日期': pd.date_range('2023-01-01', periods=100, freq='D'),
'产品': np.random.choice(['A', 'B', 'C'], 100),
'销售额': np.random.randint(1000, 10000, 100),
'数量': np.random.randint(1, 100, 100)
}
df = pd.DataFrame(sales_data)
# 分析
daily_sales = df.groupby('日期')['销售额'].sum()
product_sales = df.groupby('产品')['销售额'].sum()
return df, daily_sales, product_sales
# 2. 用户行为分析
def analyze_user_behavior():
# 创建用户行为数据
user_data = {
'用户ID': np.random.randint(1, 1000, 1000),
'行为': np.random.choice(['点击', '购买', '浏览'], 1000),
'时间': pd.date_range('2023-01-01', periods=1000, freq='H')
}
df = pd.DataFrame(user_data)
# 分析
behavior_counts = df['行为'].value_counts()
hourly_activity = df.groupby(df['时间'].dt.hour).size()
return df, behavior_counts, hourly_activity
# 3. 财务数据分析
def analyze_financial_data():
# 创建财务数据
financial_data = {
'日期': pd.date_range('2023-01-01', periods=365, freq='D'),
'收入': np.random.normal(10000, 2000, 365),
'支出': np.random.normal(8000, 1500, 365),
'利润': 0
}
df = pd.DataFrame(financial_data)
df['利润'] = df['收入'] - df['支出']
# 分析
monthly_summary = df.groupby(df['日期'].dt.month)[['收入', '支出', '利润']].sum()
profit_trend = df['利润'].rolling(window=30).mean()
return df, monthly_summary, profit_trend
# 4. 数据质量检查
def check_data_quality(df):
quality_report = {
'总行数': len(df),
'总列数': len(df.columns),
'缺失值': df.isnull().sum().to_dict(),
'重复行': df.duplicated().sum(),
'数据类型': df.dtypes.to_dict()
}
return quality_report
总结¶
Pandas是Python数据分析的核心库,主要特点: - 数据结构:Series和DataFrame - 数据读取:支持CSV、Excel、JSON等格式 - 数据选择:灵活的行列选择方式 - 数据清洗:处理缺失值、重复值等 - 数据分组:强大的分组聚合功能 - 数据合并:多种连接方式 - 数据透视:数据重塑和透视表 - 时间序列:专业的时间处理功能 - 实际应用:销售分析、用户行为、财务分析等