第四部分:数据选择与操作
4.1 数据选择方法大全
基础选择方法
# 选择单列(返回Series)
product_names = df['产品名称']
# 选择多列(返回DataFrame)
product_info = df[['产品编号', '产品名称', '价格']]
# 选择行切片
first_10 = df[:10] # 前10行
last_5 = df[-5:] # 后5行
middle_slice = df[10:20] # 第11-20行

高级索引器应用
loc索引器(基于标签的索引):
# 选择单个值
value = df.loc[5, '产品名称'] # 第6行,产品名称列的值
# 选择行和列范围
subset = df.loc[10:20, '产品名称':'价格'] # 行标签10-20,列从产品名称到价格
# 条件选择
high_sales = df.loc[df['销售额'] > 10000, ['产品名称', '销售额', '利润']]
# 多条件选择
beijing_high_sales = df.loc[
(df['销售额'] > 10000) & (df['地区'] == '北京'),
['产品名称', '销售额', '地区']
]
iloc索引器(基于位置的索引):
# 选择单个值
value = df.iloc[0, 1] # 第一行第二列
# 选择行和列位置范围
subset = df.iloc[0:5, 1:4] # 前5行,第2-4列
# 选择不连续的位置
subset = df.iloc[[0, 2, 4], [1, 3, 5]] # 第1、3、5行,第2、4、6列
# 选择所有行的特定列
all_rows_subset = df.iloc[:, [1, 3, 5]] # 所有行,第2、4、6列

条件筛选技巧
# 单条件筛选
high_sales = df[df['销售额'] > 10000]
# 多条件筛选(使用括号确保运算顺序)
beijing_high_sales = df[(df['销售额'] > 10000) & (df['地区'] == '北京')]
# 复杂条件组合
complex_filter = df[
(df['销售额'] > 10000) |
((df['销售量'] > 500) & (df['利润率'] > 0.2))
]
# 使用query方法(更简洁的语法)
result = df.query('销售额 > 10000 and 地区 == “北京”')
result = df.query('销售额 > @threshold', local_dict={'threshold': 10000})

4.2 数据排序与排名
值排序操作
# 单列排序
df_sorted = df.sort_values('销售额') # 升序
df_sorted = df.sort_values('销售额', ascending=False) # 降序
# 多列排序
df_sorted = df.sort_values(['地区', '销售额'], ascending=[True, False])
# 忽略索引重置(生成新的连续索引)
df_sorted = df.sort_values('销售额', ignore_index=True)
# 处理缺失值位置
df_sorted = df.sort_values('销售额', na_position='first') # 缺失值放在前面

自定义排序实现
# 定义自定义顺序
custom_order = ['华东', '华北', '华南', '西南', '西北', '东北']
df['地区'] = pd.Categorical(df['地区'], categories=custom_order, ordered=True)
df_sorted = df.sort_values('地区')
# 自定义函数排序
def custom_sort_key(value):
order_dict = {'高': 3, '中': 2, '低': 1}
return order_dict.get(value, 0)
df_sorted = df.iloc[df['优先级'].apply(custom_sort_key).argsort()]
排名计算应用
# 标准排名(并列排名占用后续名次)
df['销售额排名'] = df['销售额'].rank(ascending=False)
# 密集排名(并列排名不占用后续名次)
df['密集排名'] = df['销售额'].rank(method='dense', ascending=False)
# 最小排名(并列排名使用最好名次)
df['最小排名'] = df['销售额'].rank(method='min', ascending=False)
# 组内排名
df['组内排名'] = df.groupby('地区')['销售额'].rank(ascending=False)
# 百分比排名
df['百分比排名'] = df['销售额'].rank(pct=True)

第五部分:数据处理与转换
5.1 创建与修改数据
添加新列的方法
# 基本算术运算
df['总价'] = df['单价'] * df['数量']
df['利润率'] = (df['销售额'] – df['成本']) / df['销售额']
# 使用apply方法应用自定义函数
def price_category(price):
if price < 100:
return '低价'
elif price < 500:
return '中价'
else:
return '高价'
df['价格类别'] = df['单价'].apply(price_category)
# 使用lambda函数
df['价格级别'] = df['单价'].apply(lambda x: '高' if x > 500 else '低')
# 向量化操作(推荐,性能最优)
df['折扣价'] = df['单价'] * 0.9
df['是否畅销'] = df['销售量'] > 100
数据修改技巧
# 条件修改
df.loc[df['销量'] > 100, '状态'] = '热销'
df.loc[df['库存'] < 10, '状态'] = '缺货'
# 批量修改值
df['价格'] = df['价格'].replace(0, np.nan) # 将0替换为NaN
df['类别'] = df['类别'].replace({'old': 'new'}) # 值替换
# 使用map进行映射转换
size_map = {'S': 'Small', 'M': 'Medium', 'L': 'Large'}
df['尺寸描述'] = df['尺寸'].map(size_map)
# 使用replace进行多值替换
df['地区'] = df['地区'].replace({
'BJ': '北京',
'SH': '上海',
'GZ': '广州',
'SZ': '深圳'
})
文本数据处理
# 字符串操作
df['姓名'] = df['姓名'].str.title() # 首字母大写
df['邮箱'] = df['邮箱'].str.lower() # 转换为小写
df['地址'] = df['地址'].str.strip() # 去除首尾空格
# 字符串提取
df['域名'] = df['网址'].str.extract(r'://(.*?)/') # 提取域名
df['区号'] = df['电话'].str[:3] # 提取前3位作为区号
# 字符串分割
df[['姓', '名']] = df['全名'].str.split(' ', expand=True, n=1)
# 字符串包含检测
df['是否VIP'] = df['客户等级'].str.contains('VIP', case=False)
# 字符串长度
df['名称长度'] = df['产品名称'].str.len()
日期时间处理
# 确保日期列格式正确
df['日期'] = pd.to_datetime(df['日期'])
# 日期提取
df['年份'] = df['日期'].dt.year
df['月份'] = df['日期'].dt.month
df['季度'] = df['日期'].dt.quarter
df['星期'] = df['日期'].dt.day_name()
df['是否周末'] = df['日期'].dt.dayofweek >= 5
# 日期计算
df['天数差'] = (df['结束日期'] – df['开始日期']).dt.days
df['三个月后'] = df['日期'] + pd.DateOffset(months=3)
# 日期格式化
df['日期字符串'] = df['日期'].dt.strftime('%Y年%m月%d日')

5.2 分组与聚合操作
分组操作基础
# 单维度分组
grouped = df.groupby('地区')
# 多维度分组
multi_grouped = df.groupby(['地区', '产品类别'])
# 迭代分组结果
for name, group in df.groupby('地区'):
print(f”地区: {name}, 记录数: {len(group)}”)
# 可以对每个分组进行特定操作
# 获取特定分组
beijing_group = df.groupby('地区').get_group('北京')
聚合计算方法
# 单指标多聚合函数
result = df.groupby('地区')['销售额'].agg(['sum', 'mean', 'count', 'std'])
# 多指标不同聚合函数
agg_dict = {
'销售额': ['sum', 'mean'],
'利润': 'sum',
'数量': 'count',
'单价': 'mean'
}
result = df.groupby('地区').agg(agg_dict)
# 重命名聚合结果列
agg_dict_named = {
'销售额': [('总销售额', 'sum'), ('平均销售额', 'mean')],
'利润': [('总利润', 'sum')]
}
result = df.groupby('地区').agg(agg_dict_named)
# 自定义聚合函数
def profit_margin(group):
“””计算利润率”””
return (group['利润'].sum() / group['销售额'].sum()) * 100
result = df.groupby('地区').apply(profit_margin)

分组数据处理
# 分组后转换(保持原数据形状)
df['组内占比'] = df.groupby('地区')['销售额'].transform(lambda x: x / x.sum())
df['组内标准化'] = df.groupby('地区')['销售额'].transform(lambda x: (x – x.mean()) / x.std())
# 分组排名
df['地区内排名'] = df.groupby('地区')['销售额'].rank(ascending=False)
# 分组筛选
def filter_top_n(group, n=3):
“””筛选每个组的前N名”””
return group.nlargest(n, '销售额')
top_products = df.groupby('地区').apply(filter_top_n, n=3)
# 分组应用复杂函数
def calculate_stats(group):
“””计算组的统计指标”””
return pd.Series({
'记录数': len(group),
'总销售额': group['销售额'].sum(),
'平均利润': group['利润'].mean(),
'最大销量': group['数量'].max()
})
group_stats = df.groupby('地区').apply(calculate_stats)



63
收藏了,感谢分享
感谢分享👏