简体中文 繁體中文 English 日本語 Deutsch 한국 사람 بالعربية TÜRKÇE português คนไทย Français

站内搜索

搜索

活动公告

11-02 12:46
10-23 09:32
通知:本站资源由网友上传分享,如有违规等问题请到版务模块进行投诉,将及时处理!
10-23 09:31
10-23 09:28
通知:签到时间调整为每日4:00(东八区)
10-23 09:26

pandas索引输出详解从创建自定义索引到优化数据访问速度掌握pandas索引的核心概念与高级技巧提升数据分析工作的效率与准确性

3万

主题

318

科技点

3万

积分

大区版主

木柜子打湿

积分
31894

财Doro三倍冰淇淋无人之境【一阶】立华奏小樱(小丑装)⑨的冰沙以外的星空【二阶】

发表于 2025-10-3 02:00:25 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

x
1. pandas索引基础概念

pandas索引是数据分析中的核心概念之一,它提供了快速访问、操作和对齐数据的能力。索引可以看作是数据的标签或地址,允许我们高效地定位和操作数据。

1.1 什么是pandas索引

pandas索引(Index)是pandas Series和DataFrame对象的重要组成部分,它是一个不可变数组,实现了有序的、可切片的集合。索引的主要作用包括:

• 提供数据标签,便于数据访问
• 加速数据检索和操作
• 支持数据的自动对齐
• 提供数据分组和聚合的基础

1.2 索引的类型

pandas提供了多种索引类型,以适应不同的数据分析需求:
  1. import pandas as pd
  2. import numpy as np
  3. # 创建不同类型的索引
  4. # 1. RangeIndex - 默认索引
  5. range_index = pd.RangeIndex(start=0, stop=5, step=1)
  6. print("RangeIndex:", range_index)
  7. # 2. Int64Index - 整数索引
  8. int_index = pd.Int64Index([1, 3, 5, 7, 9])
  9. print("Int64Index:", int_index)
  10. # 3. Float64Index - 浮点数索引
  11. float_index = pd.Float64Index([1.5, 2.5, 3.5, 4.5, 5.5])
  12. print("Float64Index:", float_index)
  13. # 4. DatetimeIndex - 时间日期索引
  14. date_index = pd.DatetimeIndex(['2023-01-01', '2023-01-02', '2023-01-03'])
  15. print("DatetimeIndex:", date_index)
  16. # 5. PeriodIndex - 时间段索引
  17. period_index = pd.PeriodIndex(['2023-01', '2023-02', '2023-03'], freq='M')
  18. print("PeriodIndex:", period_index)
  19. # 6. TimedeltaIndex - 时间差索引
  20. timedelta_index = pd.TimedeltaIndex(['1 days', '2 days', '3 days'])
  21. print("TimedeltaIndex:", timedelta_index)
  22. # 7. CategoricalIndex - 分类索引
  23. cat_index = pd.CategoricalIndex(['a', 'b', 'c', 'a', 'b'], categories=['a', 'b', 'c'])
  24. print("CategoricalIndex:", cat_index)
  25. # 8. MultiIndex - 多级索引
  26. multi_index = pd.MultiIndex.from_tuples([('A', 1), ('A', 2), ('B', 1), ('B', 2)])
  27. print("MultiIndex:", multi_index)
复制代码

1.3 索引的基本属性

每个索引对象都有一些基本属性,可以帮助我们了解索引的特性:
  1. # 创建一个示例Series
  2. s = pd.Series([10, 20, 30, 40, 50], index=['a', 'b', 'c', 'd', 'e'])
  3. # 索引的基本属性
  4. print("索引:", s.index)
  5. print("索引值数组:", s.index.values)
  6. print("索引数据类型:", s.index.dtype)
  7. print("索引是否唯一:", s.index.is_unique)
  8. print("索引是否单调递增:", s.index.is_monotonic_increasing)
  9. print("索引是否单调递减:", s.index.is_monotonic_decreasing)
  10. print("索引长度:", len(s.index))
  11. print("索引形状:", s.index.shape)
  12. print("索引维度:", s.index.ndim)
  13. print("索引大小:", s.index.size)
复制代码

2. 创建自定义索引

在pandas中,我们可以根据需要创建自定义索引,以更好地组织和访问数据。

2.1 创建Series时指定索引
  1. # 创建Series时指定索引
  2. s = pd.Series([10, 20, 30, 40, 50], index=['a', 'b', 'c', 'd', 'e'])
  3. print("自定义索引的Series:\n", s)
  4. # 使用字典创建Series,字典的键自动成为索引
  5. data = {'a': 10, 'b': 20, 'c': 30, 'd': 40, 'e': 50}
  6. s_dict = pd.Series(data)
  7. print("使用字典创建的Series:\n", s_dict)
复制代码

2.2 创建DataFrame时指定索引
  1. # 创建DataFrame时指定索引
  2. data = {
  3.     'Name': ['Alice', 'Bob', 'Charlie', 'David', 'Eva'],
  4.     'Age': [25, 30, 35, 40, 45],
  5.     'City': ['New York', 'Los Angeles', 'Chicago', 'Houston', 'Phoenix']
  6. }
  7. df = pd.DataFrame(data, index=['a', 'b', 'c', 'd', 'e'])
  8. print("自定义索引的DataFrame:\n", df)
复制代码

2.3 使用特定方法创建索引
  1. # 从数组创建索引
  2. arr_index = pd.Index(['a', 'b', 'c', 'd', 'e'])
  3. print("从数组创建的索引:", arr_index)
  4. # 从范围创建索引
  5. range_idx = pd.RangeIndex(start=0, stop=5, step=1)
  6. print("从范围创建的索引:", range_idx)
  7. # 从日期范围创建索引
  8. date_idx = pd.date_range(start='2023-01-01', periods=5, freq='D')
  9. print("从日期范围创建的索引:", date_idx)
  10. # 从时间周期创建索引
  11. period_idx = pd.period_range(start='2023-01', periods=5, freq='M')
  12. print("从时间周期创建的索引:", period_idx)
  13. # 从时间差创建索引
  14. timedelta_idx = pd.timedelta_range(start='1 day', periods=5, freq='D')
  15. print("从时间差创建的索引:", timedelta_idx)
复制代码

2.4 创建多级索引

多级索引(MultiIndex)允许我们在多个维度上组织数据,这对于处理高维数据非常有用。
  1. # 创建多级索引的方法1:从数组创建
  2. arrays = [
  3.     ['A', 'A', 'B', 'B', 'C'],
  4.     [1, 2, 1, 2, 1]
  5. ]
  6. multi_idx = pd.MultiIndex.from_arrays(arrays, names=('letter', 'number'))
  7. print("从数组创建的多级索引:\n", multi_idx)
  8. # 创建多级索引的方法2:从元组创建
  9. tuples = [('A', 1), ('A', 2), ('B', 1), ('B', 2), ('C', 1)]
  10. multi_idx = pd.MultiIndex.from_tuples(tuples, names=('letter', 'number'))
  11. print("从元组创建的多级索引:\n", multi_idx)
  12. # 创建多级索引的方法3:从笛卡尔积创建
  13. multi_idx = pd.MultiIndex.from_product([['A', 'B', 'C'], [1, 2]], names=('letter', 'number'))
  14. print("从笛卡尔积创建的多级索引:\n", multi_idx)
  15. # 使用多级索引创建DataFrame
  16. data = {
  17.     'Value': [10, 20, 30, 40, 50, 60]
  18. }
  19. df_multi = pd.DataFrame(data, index=multi_idx)
  20. print("使用多级索引的DataFrame:\n", df_multi)
复制代码

3. 索引操作与技巧

掌握索引的基本操作和技巧是高效使用pandas的关键。

3.1 索引的基本操作
  1. # 创建示例DataFrame
  2. data = {
  3.     'Name': ['Alice', 'Bob', 'Charlie', 'David', 'Eva'],
  4.     'Age': [25, 30, 35, 40, 45],
  5.     'City': ['New York', 'Los Angeles', 'Chicago', 'Houston', 'Phoenix']
  6. }
  7. df = pd.DataFrame(data, index=['a', 'b', 'c', 'd', 'e'])
  8. # 获取索引
  9. print("DataFrame的索引:", df.index)
  10. # 修改索引
  11. df.index = ['row1', 'row2', 'row3', 'row4', 'row5']
  12. print("修改索引后的DataFrame:\n", df)
  13. # 重置索引(将索引变为列)
  14. df_reset = df.reset_index()
  15. print("重置索引后的DataFrame:\n", df_reset)
  16. # 设置索引(将列变为索引)
  17. df_set = df_reset.set_index('index')
  18. print("设置索引后的DataFrame:\n", df_set)
  19. # 重命名索引
  20. df_renamed = df.rename(index={'row1': 'first', 'row2': 'second'})
  21. print("重命名索引后的DataFrame:\n", df_renamed)
复制代码

3.2 索引的排序
  1. # 创建无序索引的DataFrame
  2. df_unordered = pd.DataFrame({
  3.     'value': [10, 20, 30, 40, 50]
  4. }, index=['c', 'a', 'e', 'b', 'd'])
  5. print("无序索引的DataFrame:\n", df_unordered)
  6. # 按索引排序
  7. df_sorted = df_unordered.sort_index()
  8. print("按索引排序后的DataFrame:\n", df_sorted)
  9. # 按索引降序排序
  10. df_sorted_desc = df_unordered.sort_index(ascending=False)
  11. print("按索引降序排序后的DataFrame:\n", df_sorted_desc)
  12. # 同时按索引和列排序
  13. df_mixed = pd.DataFrame({
  14.     'value1': [10, 20, 30, 40, 50],
  15.     'value2': [50, 40, 30, 20, 10]
  16. }, index=['c', 'a', 'e', 'b', 'd'])
  17. df_mixed_sorted = df_mixed.sort_index(axis=0).sort_values(by='value1')
  18. print("同时按索引和值排序后的DataFrame:\n", df_mixed_sorted)
复制代码

3.3 索引的唯一性检查与处理
  1. # 创建有重复索引的DataFrame
  2. df_dup = pd.DataFrame({
  3.     'value': [10, 20, 30, 40, 50]
  4. }, index=['a', 'b', 'a', 'c', 'b'])
  5. print("有重复索引的DataFrame:\n", df_dup)
  6. # 检查索引是否唯一
  7. print("索引是否唯一:", df_dup.index.is_unique)
  8. # 获取重复的索引值
  9. print("重复的索引值:", df_dup.index[df_dup.index.duplicated()])
  10. # 处理重复索引的方法1:累加重复索引的值
  11. df_dup_sum = df_dup.groupby(level=0).sum()
  12. print("累加重复索引后的DataFrame:\n", df_dup_sum)
  13. # 处理重复索引的方法2:保留第一个出现的值
  14. df_dup_first = df_dup[~df_dup.index.duplicated(keep='first')]
  15. print("保留第一个重复索引后的DataFrame:\n", df_dup_first)
  16. # 处理重复索引的方法3:保留最后一个出现的值
  17. df_dup_last = df_dup[~df_dup.index.duplicated(keep='last')]
  18. print("保留最后一个重复索引后的DataFrame:\n", df_dup_last)
复制代码

3.4 索引的重新索引
  1. # 创建示例DataFrame
  2. df = pd.DataFrame({
  3.     'value': [10, 20, 30, 40, 50]
  4. }, index=['a', 'b', 'c', 'd', 'e'])
  5. print("原始DataFrame:\n", df)
  6. # 重新索引
  7. new_index = ['a', 'c', 'e', 'g', 'i']
  8. df_reindexed = df.reindex(new_index)
  9. print("重新索引后的DataFrame:\n", df_reindexed)
  10. # 重新索引并填充缺失值
  11. df_reindexed_fill = df.reindex(new_index, fill_value=0)
  12. print("重新索引并填充缺失值后的DataFrame:\n", df_reindexed_fill)
  13. # 重新索引并使用前向填充
  14. df_reindexed_ffill = df.reindex(new_index, method='ffill')
  15. print("重新索引并使用前向填充后的DataFrame:\n", df_reindexed_ffill)
  16. # 重新索引并使用后向填充
  17. df_reindexed_bfill = df.reindex(new_index, method='bfill')
  18. print("重新索引并使用后向填充后的DataFrame:\n", df_reindexed_bfill)
复制代码

4. 优化数据访问速度

在处理大型数据集时,优化数据访问速度是至关重要的。pandas提供了多种方法来提高数据访问的效率。

4.1 索引的选择与使用
  1. # 创建大型DataFrame
  2. large_df = pd.DataFrame({
  3.     'value': np.random.rand(100000)
  4. })
  5. # 不使用索引的访问(慢)
  6. %timeit large_df[large_df['value'] > 0.5]
  7. # 设置索引后的访问(快)
  8. indexed_df = large_df.set_index(pd.Index(range(100000)))
  9. %timeit indexed_df.loc[indexed_df['value'] > 0.5]
  10. # 使用分类索引优化
  11. cat_df = large_df.copy()
  12. cat_df['category'] = pd.Categorical(np.random.choice(['A', 'B', 'C', 'D'], size=100000))
  13. cat_df = cat_df.set_index('category')
  14. %timeit cat_df.loc['A']
复制代码

4.2 排序索引的优势
  1. # 创建未排序的大型DataFrame
  2. unsorted_df = pd.DataFrame({
  3.     'value': np.random.rand(100000)
  4. }, index=np.random.permutation(range(100000)))
  5. # 在未排序索引上的查询(慢)
  6. %timeit unsorted_df.loc[50000]
  7. # 排序索引后的查询(快)
  8. sorted_df = unsorted_df.sort_index()
  9. %timeit sorted_df.loc[50000]
  10. # 使用二分查找优化查询
  11. %timeit sorted_df.index.get_loc(50000)
复制代码

4.3 使用适当的数据类型
  1. # 创建使用默认数据类型的DataFrame
  2. default_df = pd.DataFrame({
  3.     'id': range(100000),
  4.     'value': np.random.rand(100000)
  5. })
  6. # 使用优化数据类型的DataFrame
  7. optimized_df = pd.DataFrame({
  8.     'id': pd.Series(range(100000), dtype='int32'),
  9.     'value': pd.Series(np.random.rand(100000), dtype='float32')
  10. })
  11. # 比较内存使用
  12. print("默认DataFrame的内存使用:", default_df.memory_usage().sum(), "bytes")
  13. print("优化DataFrame的内存使用:", optimized_df.memory_usage().sum(), "bytes")
  14. # 比较查询速度
  15. %timeit default_df.loc[50000]
  16. %timeit optimized_df.loc[50000]
复制代码

4.4 使用分类数据类型
  1. # 创建使用字符串的DataFrame
  2. str_df = pd.DataFrame({
  3.     'category': np.random.choice(['A', 'B', 'C', 'D'], size=100000),
  4.     'value': np.random.rand(100000)
  5. })
  6. # 创建使用分类数据类型的DataFrame
  7. cat_df = pd.DataFrame({
  8.     'category': pd.Categorical(np.random.choice(['A', 'B', 'C', 'D'], size=100000)),
  9.     'value': np.random.rand(100000)
  10. })
  11. # 比较内存使用
  12. print("字符串DataFrame的内存使用:", str_df.memory_usage().sum(), "bytes")
  13. print("分类DataFrame的内存使用:", cat_df.memory_usage().sum(), "bytes")
  14. # 比较查询速度
  15. %timeit str_df[str_df['category'] == 'A']
  16. %timeit cat_df[cat_df['category'] == 'A']
复制代码

4.5 使用多级索引优化
  1. # 创建扁平的DataFrame
  2. flat_df = pd.DataFrame({
  3.     'group': np.random.choice(['A', 'B', 'C'], size=100000),
  4.     'subgroup': np.random.choice([1, 2, 3], size=100000),
  5.     'value': np.random.rand(100000)
  6. })
  7. # 创建多级索引的DataFrame
  8. multi_df = flat_df.set_index(['group', 'subgroup'])
  9. # 比较查询速度
  10. %timeit flat_df[(flat_df['group'] == 'A') & (flat_df['subgroup'] == 1)]
  11. %timeit multi_df.loc[('A', 1)]
复制代码

5. 高级索引技巧

掌握高级索引技巧可以让我们更灵活、更高效地处理数据。

5.1 布尔索引
  1. # 创建示例DataFrame
  2. df = pd.DataFrame({
  3.     'Name': ['Alice', 'Bob', 'Charlie', 'David', 'Eva'],
  4.     'Age': [25, 30, 35, 40, 45],
  5.     'City': ['New York', 'Los Angeles', 'Chicago', 'Houston', 'Phoenix'],
  6.     'Salary': [50000, 60000, 70000, 80000, 90000]
  7. })
  8. # 使用布尔索引
  9. print("年龄大于30的人:\n", df[df['Age'] > 30])
  10. # 组合多个条件
  11. print("年龄大于30且工资大于70000的人:\n", df[(df['Age'] > 30) & (df['Salary'] > 70000)])
  12. # 使用isin方法
  13. print("城市是New York或Chicago的人:\n", df[df['City'].isin(['New York', 'Chicago'])])
  14. # 使用字符串方法
  15. print("名字以A开头的人:\n", df[df['Name'].str.startswith('A')])
复制代码

5.2 位置索引与标签索引
  1. # 创建示例DataFrame
  2. df = pd.DataFrame({
  3.     'Name': ['Alice', 'Bob', 'Charlie', 'David', 'Eva'],
  4.     'Age': [25, 30, 35, 40, 45],
  5.     'City': ['New York', 'Los Angeles', 'Chicago', 'Houston', 'Phoenix']
  6. }, index=['a', 'b', 'c', 'd', 'e'])
  7. # 使用iloc进行位置索引
  8. print("使用iloc获取第一行:\n", df.iloc[0])
  9. print("使用iloc获取前两行:\n", df.iloc[0:2])
  10. print("使用iloc获取第一列:\n", df.iloc[:, 0])
  11. print("使用iloc获取第一行第一列:\n", df.iloc[0, 0])
  12. # 使用loc进行标签索引
  13. print("使用loc获取标签为'a'的行:\n", df.loc['a'])
  14. print("使用loc获取标签为'a'和'b'的行:\n", df.loc[['a', 'b']])
  15. print("使用loc获取'Name'列:\n", df.loc[:, 'Name'])
  16. print("使用loc获取标签为'a'的行和'Name'列:\n", df.loc['a', 'Name'])
  17. # 混合使用位置索引和标签索引
  18. print("使用iloc和loc的组合:\n", df.loc[df.index[0], 'Name'])
复制代码

5.3 多级索引操作
  1. # 创建多级索引的DataFrame
  2. arrays = [
  3.     ['A', 'A', 'A', 'B', 'B', 'B'],
  4.     [1, 2, 3, 1, 2, 3]
  5. ]
  6. multi_index = pd.MultiIndex.from_arrays(arrays, names=('group', 'id'))
  7. df_multi = pd.DataFrame({
  8.     'value': [10, 20, 30, 40, 50, 60]
  9. }, index=multi_index)
  10. print("多级索引DataFrame:\n", df_multi)
  11. # 获取特定级别的所有值
  12. print("第一级的所有值:", df_multi.index.get_level_values(0))
  13. print("第二级的所有值:", df_multi.index.get_level_values(1))
  14. # 使用xs方法获取交叉部分
  15. print("获取group='A'的所有行:\n", df_multi.xs('A', level='group'))
  16. print("获取id=1的所有行:\n", df_multi.xs(1, level='id'))
  17. # 使用loc获取多级索引
  18. print("获取group='A'且id=1的行:\n", df_multi.loc[('A', 1)])
  19. # 使用切片获取多级索引
  20. print("获取group='A'的所有行:\n", df_multi.loc['A'])
  21. print("获取group='A'且id从1到2的行:\n", df_multi.loc[('A', slice(1, 2))])
复制代码

5.4 索引的算术运算
  1. # 创建两个示例Series
  2. s1 = pd.Series([10, 20, 30, 40], index=['a', 'b', 'c', 'd'])
  3. s2 = pd.Series([30, 40, 50, 60], index=['c', 'd', 'e', 'f'])
  4. # 索引对齐的加法
  5. print("s1 + s2:\n", s1 + s2)
  6. # 使用add方法并指定填充值
  7. print("s1.add(s2, fill_value=0):\n", s1.add(s2, fill_value=0))
  8. # 其他算术运算
  9. print("s1 - s2:\n", s1 - s2)
  10. print("s1 * s2:\n", s1 * s2)
  11. print("s1 / s2:\n", s1 / s2)
  12. # DataFrame的索引对齐运算
  13. df1 = pd.DataFrame({
  14.     'A': [1, 2, 3],
  15.     'B': [4, 5, 6]
  16. }, index=['a', 'b', 'c'])
  17. df2 = pd.DataFrame({
  18.     'A': [7, 8, 9],
  19.     'C': [10, 11, 12]
  20. }, index=['b', 'c', 'd'])
  21. print("df1 + df2:\n", df1 + df2)
  22. print("df1.add(df2, fill_value=0):\n", df1.add(df2, fill_value=0))
复制代码

5.5 索引的迭代与遍历
  1. # 创建示例DataFrame
  2. df = pd.DataFrame({
  3.     'Name': ['Alice', 'Bob', 'Charlie', 'David', 'Eva'],
  4.     'Age': [25, 30, 35, 40, 45],
  5.     'City': ['New York', 'Los Angeles', 'Chicago', 'Houston', 'Phoenix']
  6. }, index=['a', 'b', 'c', 'd', 'e'])
  7. # 遍历索引
  8. print("遍历索引:")
  9. for idx in df.index:
  10.     print(idx)
  11. # 遍历索引和值
  12. print("\n遍历索引和值:")
  13. for idx, row in df.iterrows():
  14.     print(f"Index: {idx}, Name: {row['Name']}, Age: {row['Age']}")
  15. # 使用itertuples方法(更快)
  16. print("\n使用itertuples遍历:")
  17. for row in df.itertuples():
  18.     print(f"Index: {row.Index}, Name: {row.Name}, Age: {row.Age}")
  19. # 遍历多级索引
  20. arrays = [
  21.     ['A', 'A', 'B', 'B'],
  22.     [1, 2, 1, 2]
  23. ]
  24. multi_index = pd.MultiIndex.from_arrays(arrays, names=('group', 'id'))
  25. df_multi = pd.DataFrame({
  26.     'value': [10, 20, 30, 40]
  27. }, index=multi_index)
  28. print("\n遍历多级索引:")
  29. for idx in df_multi.index:
  30.     print(f"Group: {idx[0]}, ID: {idx[1]}")
复制代码

6. 实际应用案例

通过实际案例,我们可以更好地理解如何应用pandas索引技术解决实际问题。

6.1 时间序列数据分析
  1. # 创建时间序列数据
  2. dates = pd.date_range(start='2023-01-01', end='2023-12-31', freq='D')
  3. values = np.random.randn(len(dates)).cumsum()
  4. ts = pd.Series(values, index=dates)
  5. print("时间序列数据的前5行:\n", ts.head())
  6. # 按时间范围选择数据
  7. print("2023年1月的数据:\n", ts['2023-01'])
  8. print("2023年第一季度的数据:\n", ts['2023-Q1'])
  9. # 使用日期时间索引的特性
  10. print("每月最后一天的数据:\n", ts[ts.index.is_month_end])
  11. # 重采样
  12. print("每月的平均值:\n", ts.resample('M').mean())
  13. # 滚动窗口计算
  14. print("7天滚动平均值:\n", ts.rolling(window=7).mean().head(10))
复制代码

6.2 多维数据分析
  1. # 创建销售数据
  2. products = ['A', 'B', 'C']
  3. regions = ['North', 'South', 'East', 'West']
  4. dates = pd.date_range(start='2023-01-01', periods=12, freq='M')
  5. # 生成随机销售数据
  6. sales_data = []
  7. for date in dates:
  8.     for product in products:
  9.         for region in regions:
  10.             sales_data.append({
  11.                 'Date': date,
  12.                 'Product': product,
  13.                 'Region': region,
  14.                 'Sales': np.random.randint(100, 1000)
  15.             })
  16. sales_df = pd.DataFrame(sales_data)
  17. # 设置多级索引
  18. sales_multi = sales_df.set_index(['Date', 'Product', 'Region'])
  19. print("多级索引的销售数据:\n", sales_multi.head())
  20. # 使用多级索引进行查询
  21. print("2023年1月产品A的销售数据:\n", sales_multi.loc[('2023-01-31', 'A')])
  22. # 使用多级索引进行聚合
  23. print("按产品和地区汇总的销售数据:\n", sales_multi.groupby(level=['Product', 'Region']).sum())
  24. # 使用unstack将多级索引转换为列
  25. print("将地区转换为列的销售数据:\n", sales_multi.groupby(level=['Date', 'Product']).sum().unstack('Region'))
复制代码

6.3 数据合并与连接
  1. # 创建员工数据
  2. employees = pd.DataFrame({
  3.     'id': [1, 2, 3, 4, 5],
  4.     'name': ['Alice', 'Bob', 'Charlie', 'David', 'Eva'],
  5.     'department': ['HR', 'IT', 'Finance', 'IT', 'HR']
  6. })
  7. # 创建薪资数据
  8. salaries = pd.DataFrame({
  9.     'id': [1, 2, 3, 4, 6],  # 注意:缺少id=5,多了一个id=6
  10.     'salary': [50000, 60000, 70000, 80000, 90000]
  11. })
  12. # 设置索引
  13. employees_idx = employees.set_index('id')
  14. salaries_idx = salaries.set_index('id')
  15. # 内连接
  16. inner_join = employees_idx.join(salaries_idx, how='inner')
  17. print("内连接结果:\n", inner_join)
  18. # 左连接
  19. left_join = employees_idx.join(salaries_idx, how='left')
  20. print("左连接结果:\n", left_join)
  21. # 右连接
  22. right_join = employees_idx.join(salaries_idx, how='right')
  23. print("右连接结果:\n", right_join)
  24. # 外连接
  25. outer_join = employees_idx.join(salaries_idx, how='outer')
  26. print("外连接结果:\n", outer_join)
复制代码

6.4 数据透视表
  1. # 创建销售数据
  2. sales_data = pd.DataFrame({
  3.     'Region': ['North', 'South', 'East', 'West', 'North', 'South', 'East', 'West'],
  4.     'Product': ['A', 'A', 'B', 'B', 'A', 'B', 'A', 'B'],
  5.     'Quarter': ['Q1', 'Q1', 'Q1', 'Q1', 'Q2', 'Q2', 'Q2', 'Q2'],
  6.     'Sales': [100, 150, 200, 250, 120, 180, 220, 270]
  7. })
  8. print("原始销售数据:\n", sales_data)
  9. # 创建数据透视表
  10. pivot_table = pd.pivot_table(sales_data, values='Sales', index='Region', columns='Product', aggfunc='sum')
  11. print("简单的数据透视表:\n", pivot_table)
  12. # 创建多级数据透视表
  13. multi_pivot = pd.pivot_table(sales_data, values='Sales', index=['Region', 'Quarter'], columns='Product', aggfunc='sum')
  14. print("多级数据透视表:\n", multi_pivot)
  15. # 创建带有多个聚合函数的数据透视表
  16. agg_pivot = pd.pivot_table(sales_data, values='Sales', index='Region', columns='Product', aggfunc=[sum, 'mean'])
  17. print("多聚合函数的数据透视表:\n", agg_pivot)
复制代码

6.5 性能优化案例
  1. # 创建大型数据集
  2. large_data = pd.DataFrame({
  3.     'id': range(1, 100001),
  4.     'value': np.random.rand(100000),
  5.     'category': np.random.choice(['A', 'B', 'C', 'D'], size=100000)
  6. })
  7. # 不使用索引的查询
  8. %timeit large_data[large_data['category'] == 'A']
  9. # 设置分类索引
  10. category_indexed = large_data.set_index('category')
  11. %timeit category_indexed.loc['A']
  12. # 使用排序优化
  13. sorted_data = large_data.sort_values('category')
  14. %timeit sorted_data[sorted_data['category'] == 'A']
  15. # 使用多级索引
  16. multi_indexed = large_data.set_index(['category', 'id'])
  17. %timeit multi_indexed.loc['A']
  18. # 使用查询方法
  19. %timeit large_data.query('category == "A"')
  20. # 使用eval方法
  21. %timeit large_data[large_data.eval('category == "A"')]
复制代码

7. 总结与最佳实践

在本文中,我们详细探讨了pandas索引的各个方面,从基础概念到高级技巧,以及如何优化数据访问速度。以下是一些关键点和最佳实践:

7.1 索引的核心概念

• 索引是pandas数据结构的核心组成部分,提供了快速访问和操作数据的能力
• pandas支持多种索引类型,包括整数索引、浮点数索引、时间日期索引、分类索引和多级索引等
• 索引是不可变的,但可以通过各种方法进行修改和操作

7.2 创建自定义索引

• 可以在创建Series或DataFrame时指定索引
• 可以使用各种方法创建特定类型的索引,如日期范围索引、时间周期索引等
• 多级索引允许我们在多个维度上组织数据,适用于复杂的数据分析场景

7.3 索引操作与技巧

• 掌握基本的索引操作,如获取、修改、重置和设置索引
• 了解如何对索引进行排序,以及排序对查询性能的影响
• 学会处理重复索引,包括检查、识别和处理重复索引值
• 掌握重新索引技术,包括填充缺失值的方法

7.4 优化数据访问速度

• 选择合适的索引类型可以显著提高数据访问速度
• 排序索引可以提高查询性能,特别是对于大型数据集
• 使用适当的数据类型可以减少内存使用并提高处理速度
• 分类数据类型对于重复值多的列特别有效
• 多级索引可以优化多维数据的查询性能

7.5 高级索引技巧

• 布尔索引提供了灵活的数据筛选方式
• 位置索引(iloc)和标签索引(loc)各有适用场景
• 多级索引操作是处理高维数据的关键技能
• 索引的算术运算会自动对齐,这是pandas的强大功能之一
• 了解不同的索引遍历方法,并根据场景选择最合适的方法

7.6 最佳实践

1. 为数据选择合适的索引:根据数据的特点和分析需求,选择最适合的索引类型。例如,时间序列数据应使用DatetimeIndex,分类数据应使用CategoricalIndex。
2. 保持索引的唯一性:尽可能使用唯一索引,这可以提高查询性能并避免歧义。
3. 排序索引以提高性能:对于大型数据集,排序索引可以显著提高查询速度。
4. 使用多级索引处理高维数据:对于具有多个维度的数据,使用多级索引可以更有效地组织和访问数据。
5. 选择合适的数据类型:使用适当的数据类型(如int32代替int64,category代替object)可以减少内存使用并提高处理速度。
6. 避免链式索引:避免使用如df[‘column’][index]这样的链式索引,而是使用df.loc[index, ‘column’]。
7. 使用向量化操作:尽可能使用向量化操作而不是循环,这可以显著提高性能。
8. 考虑使用查询方法:对于复杂的查询条件,考虑使用query()方法,它通常更高效且代码更清晰。

为数据选择合适的索引:根据数据的特点和分析需求,选择最适合的索引类型。例如,时间序列数据应使用DatetimeIndex,分类数据应使用CategoricalIndex。

保持索引的唯一性:尽可能使用唯一索引,这可以提高查询性能并避免歧义。

排序索引以提高性能:对于大型数据集,排序索引可以显著提高查询速度。

使用多级索引处理高维数据:对于具有多个维度的数据,使用多级索引可以更有效地组织和访问数据。

选择合适的数据类型:使用适当的数据类型(如int32代替int64,category代替object)可以减少内存使用并提高处理速度。

避免链式索引:避免使用如df[‘column’][index]这样的链式索引,而是使用df.loc[index, ‘column’]。

使用向量化操作:尽可能使用向量化操作而不是循环,这可以显著提高性能。

考虑使用查询方法:对于复杂的查询条件,考虑使用query()方法,它通常更高效且代码更清晰。

通过掌握这些概念和技巧,你可以更高效、更准确地使用pandas进行数据分析工作,提高工作效率和结果质量。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

频道订阅

频道订阅

加入社群

加入社群

联系我们|TG频道|RSS

Powered by Pixtech

© 2025 Pixtech Team.