本文目录导读:

我来详细介绍使用Pandas进行数据索引选择的多种方法,从基础到进阶。
基础数据准备
import pandas as pd
import numpy as np
# 创建示例数据
df = pd.DataFrame({
'姓名': ['张三', '李四', '王五', '赵六', '钱七'],
'年龄': [25, 30, 35, 28, 32],
'城市': ['北京', '上海', '广州', '深圳', '北京'],
'薪资': [15000, 20000, 18000, 22000, 16000],
'部门': ['技术', '市场', '技术', '财务', '技术']
})
print("原始数据:")
print(df)
基础索引方法
1 loc - 基于标签的索引
# 选择单行
print("选择第2行:")
print(df.loc[1])
# 选择多行
print("\n选择第1-3行:")
print(df.loc[0:2])
# 选择特定列
print("\n选择姓名和年龄列:")
print(df.loc[:, ['姓名', '年龄']])
# 条件选择
print("\n选择年龄大于30的员工:")
print(df.loc[df['年龄'] > 30, ['姓名', '年龄', '薪资']])
# 布尔索引
print("\n选择北京的技术人员:")
print(df.loc[(df['城市'] == '北京') & (df['部门'] == '技术')])
2 iloc - 基于位置的索引
# 选择第一行
print("选择第一行:")
print(df.iloc[0])
# 选择前3行
print("\n选择前3行:")
print(df.iloc[:3])
# 选择特定位置的单元格
print("\n选择第2行第3列:")
print(df.iloc[1, 2])
# 选择特定行列
print("\n选择第1-3行,第1-3列:")
print(df.iloc[0:3, 0:3])
# 使用列表选择
print("\n选择第0、2、4行:")
print(df.iloc[[0, 2, 4]])
高级索引技巧
1 多级索引 (MultiIndex)
# 创建多级索引数据
arrays = [
['北京', '北京', '上海', '上海', '广州'],
['技术', '市场', '技术', '市场', '技术']
]
index = pd.MultiIndex.from_arrays(arrays, names=['城市', '部门'])
multi_df = pd.DataFrame({
'销售额': [100, 150, 120, 180, 90],
'利润': [20, 30, 25, 35, 18]
}, index=index)
print("多级索引数据:")
print(multi_df)
# 选择特定层级
print("\n选择北京的数据:")
print(multi_df.loc['北京'])
# 选择特定组合
print("\n选择北京技术部门:")
print(multi_df.loc[('北京', '技术')])
# 使用xs选择
print("\n选择所有技术部门:")
print(multi_df.xs('技术', level='部门'))
2 条件组合索引
# 复杂条件选择
high_salary = df[df['薪资'] > 17000]
tech_dept = df[df['部门'] == '技术']
print("高薪技术人员:")
print(high_salary[high_salary['部门'] == '技术'])
# 使用query方法
print("\n使用query查询:")
print(df.query('薪资 > 17000 and 部门 == "技术"'))
# 使用isin
print("\n选择北京或上海的员工:")
print(df[df['城市'].isin(['北京', '上海'])])
实战案例
案例1:数据分析筛选
# 创建更大规模的数据
np.random.seed(42)
sales_data = pd.DataFrame({
'日期': pd.date_range('2024-01-01', periods=100, freq='D'),
'产品': np.random.choice(['A', 'B', 'C'], 100),
'销售额': np.random.randint(1000, 10000, 100),
'数量': np.random.randint(10, 100, 100),
'门店': np.random.choice(['东区', '西区', '南区', '北区'], 100)
})
# 选择特定时间段
print("2024年1月的数据:")
jan_data = sales_data[
(sales_data['日期'] >= '2024-01-01') &
(sales_data['日期'] <= '2024-01-31')
]
print(jan_data.head())
# 选择高销售额的产品A
print("\n产品A高销售额记录:")
high_sales_A = sales_data[
(sales_data['产品'] == 'A') &
(sales_data['销售额'] > 5000)
]
print(high_sales_A.head())
# 按门店分组统计
print("\n各门店销售额统计:")
store_stats = sales_data.groupby('门店').agg({
'销售额': ['sum', 'mean', 'max'],
'数量': 'sum'
})
print(store_stats)
案例2:金融数据处理
# 创建股票数据
dates = pd.date_range('2024-01-01', periods=50, freq='D')
stock_data = pd.DataFrame({
'日期': dates,
'开盘价': np.random.uniform(100, 110, 50),
'收盘价': np.random.uniform(100, 110, 50),
'成交量': np.random.randint(10000, 100000, 50)
})
# 设置日期为索引
stock_data.set_index('日期', inplace=True)
# 选择特定日期范围
print("1月中旬的数据:")
mid_jan = stock_data.loc['2024-01-10':'2024-01-20']
print(mid_jan)
# 条件选择(涨幅超过2%)
stock_data['涨跌幅'] = (stock_data['收盘价'] - stock_data['开盘价']) / stock_data['开盘价']
print("\n涨幅超过2%的交易日:")
big_gain = stock_data[stock_data['涨跌幅'] > 0.02]
print(big_gain[['开盘价', '收盘价', '涨跌幅']])
# 成交量排名前5的交易日
print("\n成交量最大的5天:")
top_volume = stock_data.nlargest(5, '成交量')
print(top_volume)
性能优化技巧
import time
# 创建大数据集
large_df = pd.DataFrame({
'A': range(1000000),
'B': np.random.randn(1000000),
'C': np.random.choice(['X', 'Y', 'Z'], 1000000)
})
# 比较不同索引方法的性能
start = time.time()
result1 = large_df[large_df['A'] > 500000]
print(f"直接布尔索引: {time.time() - start:.4f}秒")
start = time.time()
large_df2 = large_df.set_index('A')
result2 = large_df2.loc[500000:]
print(f"使用索引: {time.time() - start:.4f}秒")
# 使用query优化
start = time.time()
result3 = large_df.query('A > 500000 and B > 0')
print(f"使用query: {time.time() - start:.4f}秒")
常见问题处理
# 处理缺失值
df_with_nan = df.copy()
df_with_nan.loc[2:4, '薪资'] = np.nan
print("包含缺失值的数据:")
print(df_with_nan)
# 选择非空值
print("\n薪资不为空的记录:")
print(df_with_nan[df_with_nan['薪资'].notna()])
# 处理重复索引
df_duplicate = pd.concat([df, df.iloc[0:2]])
print("\n包含重复索引的数据:")
print(df_duplicate)
# 删除重复行
print("\n删除重复行:")
print(df_duplicate.drop_duplicates())
索引选择速查表
| 方法 | 用途 | 示例 |
|---|---|---|
loc[] |
标签索引 | df.loc['a':'c'] |
iloc[] |
位置索引 | df.iloc[0:3] |
| 列选择 | df['列名'] |
|
query() |
查询语法 | df.query('a > 1') |
filter() |
模式匹配 | df.filter(like='name') |
这些技巧在日常数据处理中非常实用,建议根据实际需求选择最合适的索引方法。
版权声明:NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播