索引Index

本文详细介绍了Pandas库中DataFrame的索引操作,包括如何设置行和列索引,使用`set_index`和`reset_index`方法,以及各种类型的索引如数字索引、类别索引、间隔索引和时间索引。此外,还探讨了索引的属性、操作和重命名方法,提供了一系列实例展示如何在实际数据处理中灵活运用这些功能。
摘要由CSDN通过智能技术生成

深入浅出Pandas读书笔记

4.1 索引操作

4.1.1 认识索引

  • 行索引是数据的索引, 列索引指向的是一个Series
  • DataFrame的索引也是系列形成的Series的索引
  • 建立索引让数据更加直观明确, 每行数据是针对哪个主体的
  • 建立索引方便数据处理
  • 索引允许重复, 但业务上一般不会让它重复

4.1.2 建立索引 set_index

df = pd.read_excel(data, index_col='name') # 将索引设置为name
或
df = pd.read_excel(data)
df.set_index('name')

# 设置两层索引
df.set_index(['name', 'team'])
df.set_index([df.name.str[0], 'name']) # 将姓名的第一个字母和姓名设置为索引
# 以上都没有修改原df, 如果希望替换吗可以用`df=...`去接收, 或直接传入`inplace=True`

# 将一个Series作为索引
s = pd.Series([i for i in range(100)])
df.set_index(s)
df.set_index([s, 'name'])

# 两个常规操作
df.set_index('month', drop=False) # 保留原列
df.set_index('month', append=True) # 保留原索引

4.1.3 重置索引 reset_index

df.reset_index()
# 重置原索引, 同时给你一个新的重新排序好的数字索引
df.reset_index(drop=True) # 可以用来重排已经被打乱的数字索引
df.reset_index(inplace=True)
df.set_index(['month', 'year']).reset_index(level=1) # 先将month, year设为index, 然后将`level=1`位置的year取消索引

4.1.4 索引类型

数字索引
RangeIndex: 单调整数范围的不可变索引
Int64Index: int64类型,有序可切片集合的不可变 ndarray
UInt64Index: 无符号整数标签的
Float64Index: Float64 类型

pd.Index([1, 2, 3])
# Int64Index([1, 2, 3], dtype='int64')
pd.RangeIndex(1, 100, 2)
# RangeIndex(start=1, stop=100, step=2)
pd.Int64Index([1, 2, 3, -4], name='num') # v2.0 将弃用
# Int64Index([1, 2, 3, -4], dtype='int64', name='num')
pd.UInt64Index([1, 2, 3, 4]) # v2.0 将弃用
# UInt64Index([1, 2, 3, 4], dtype='uint64')
pd.Float64Index([1.2, 2.3, 3, 4]) # v2.0 将弃用
# Float64Index([1.2, 2.3, 3.0, 4.0], dtype='float64')

类别索引

pd.CategoricalIndex(['a', 'b', 'a', 'b'])

间隔索引
代表每个数据的数值或者时间区间, 一般应用于分箱数据

pd.interval_range(0, 5)
# IntervalIndex([(0, 1], (1, 2], (2, 3], (3, 4], (4, 5]], dtype='interval[int64, right]')

多层索引

arr = [[1, 1, 2, 2], ['red', 'blue', 'red', 'blue']]
pd.MultiIndex.from_arrays(arr, names=['num', 'color'])
''' MultiIndex(
    [(1,  'red'),
     (1, 'blue'),
     (2,  'red'),
     (2, 'blue')],
    names=['num', 'color'])
'''

时间索引
时序数据的时间

pd.date_range('2020-1-1', '2020-1-5')
'''
DatetimeIndex(['2020-01-01', '2020-01-02', '2020-01-03', '2020-01-04',
               '2020-01-05'],
              dtype='datetime64[ns]', freq='D')
'''
# 以月为周期
pd.period_range('2020-1-1', '2021-1-5', freq='M')
'''
PeriodIndex(['2020-01', '2020-02', '2020-03', '2020-04', '2020-05', '2020-06',
             '2020-07', '2020-08', '2020-09', '2020-10', '2020-11', '2020-12',
             '2021-01'],
            dtype='period[M]')
'''

时间差索引
周期索引

4.1.5 索引对象

行和列的索引在Pandas里其实是一个Index对象,

# 创建一个Index对象
pd.Index([1, 2, 3])
# 查看索引对象
df.index
df.columns

4.1.6 索引的属性

# 属性
df.index.name # 名称
df.index.array # array 数组
df.index.dtype # 数据类型
df.index.shape # 形状
df.index.size # 元素数量
df.index.values # array 数组
# 其他,不常用
df.index.empty # 是否为空
df.index.is_unique # 是否不重复
df.index.names # 名称列表
df.index.is_all_dates # 是否全是日期时间
df.index.has_duplicates # 是否有重复值

4.1.7 索引的操作

# 方法
df.index.astype('int64') # 转换类型
df.index.isin() # 是否存在
df.index.rename('number') # 修改索引名称
df.index.nunique() # 不重复值的数量 num of unique
df.index.sort_values(ascending=False,) # 排序, 倒序
df.index.map(lambda x: x+'_') # map 函数处理
df.index.str.replace('_', '') # str 替换
df.index.str.split('_') # 分隔
df.index.to_list() # 转为列表
df.index.to_frame(index=False, name='a') # 转成 DataFrame
df.index.to_series() # 转 series
df.index.to_numpy() # 转为 numpy
df.index.unique() # 去重
df.index.value_counts() # 去重及数量
df.index.where(df.index=='a') # 筛选, 与df.where 不一样
df.index.rename('grade', inplace=False) # 重命名索引名称
df.index.rename(['species', 'year']) # 多层,重命名索引名称
df.index.max() # 最大值
df.index.argmax() # 最大索引值
df.index.any()
df.index.all()
df.index.T # 转置,多层索引里很有用

# 其他,不常用
df.index.append(pd.Index([4,5])) # 追加
df.index.repeat(2) # 重复几次
df.index.inferred_type # 推测数据类型
df.index.hasnans # 有没有空值
df.index.is_monotonic_decreasing # 是否单调递减
df.index.is_monotonic # 是否单调递增
df.index.is_monotonic_increasing # 是否单调递增
df.index.nbytes # 基础数据中的字节数
df.index.ndim # 维度数,维数
df.index.nlevels # 索引层级数,通常为 1
df.index.min() # 最小值
df.index.argmin() # 最小索引值
df.index.argsort() # 顺序值组成的数组
df.index.asof(2) # 返回最近的索引
# numpy dtype or pandas type
df.index.astype('int64', copy=True) # 深拷贝
# 拷贝
df.index.copy(name='new', deep=True, dtype='int64')
df.index.delete(1) # 删除指定位置
# 对比不同
df.index.difference(pd.Index([1,2,4]), sort=False)
df.index.drop('a', errors='ignore') # 删除
df.index.drop_duplicates(keep='first') # 去重值
df.index.droplevel(0) # 删除层级
df.index.dropna(how='all') # 删除空值
df.index.duplicated(keep='first') # 重复值在结果数组中为True
df.index.equals(df.index) # 与另外一个索引对象是否相同
df.index.factorize() # 分解成(array:0-n, Index)
df.index.fillna(0, {0:'nan'}) # 填充空值
# 字符列表, 把 name 值加在第一位, 每个值加10
df.index.format(name=True, formatter=lambda x: x+10)

# 返回一个 array, 指定值的索引位数组,不在的为 -1
df.index.get_indexer([2, 9])
# 获取 指定层级 Index 对象
df.index.get_level_values(0)
# 指定索引的位置,见示例
df.index.get_loc('b')
df.index.insert(2, 'f') # 在索引位 2 插入 f
df.index.intersection(df.index) # 交集
df.index.is_(df.index) # 类似 is 检查
df.index.is_categorical() # 是否分类数据
df.index.is_type_compatible(df.index) # 类型是否兼容
df.index.is_type_compatible(1) # 类型是否兼容

df.index.isna() # array 是否为空
df.index.isnull() # array 是否缺失值
df.index.join(df.index, how='left') # 连接
df.index.notna() # 是否不存在的值
df.index.notnull() # 是否不存在的值
df.index.ravel() # 展平值的ndarray
df.index.reindex(['a','b']) # 新索引 (Index,array:0-n)
df.index.searchsorted('f') # 如果插入这个值排序后在哪个索引位
df.index.searchsorted([0, 4]) # array([0, 3]) 多个
df.index.set_names('quarter') # 设置索引名称
df.index.set_names('species', level=0)
df.index.set_names(['kind', 'year'], inplace=True)
df.index.shift(10, freq='D') # 日期索引向前移动 10 天
idx1.symmetric_difference(idx2) # 两个索引不同的内容
idx1.union(idx2) # 拼接

df.add_prefix('t_') # 表头加前缀
df.add_suffix('_d') # 表头加后缀
df.first_valid_index() # 第一个有值的索引
df.last_valid_index() # 最后一个有值的索引

# 掩码设置的值的新索引, 小于 10 的变为 0
df.index.putmask(df.index<10, 0)

4.1.8 索引重命名 rename

4.1.9 修改索引内容 rename

df.reanme可以给定一个字典, 键是原列名, 值是想要修改的名字, 还可以传入一个与原索引等长度序列进行覆盖修改, 也可以传入一个函数处理原索引名

# 一一对应修改列索引
df.rename(columns={"A": "a", "B": "c"})
df.rename(str.lower, axis='columns') # 传入函数, 修改原索引
# 修改行索引
df.rename(index={0: "x", 1: "y", 2: "z"})
df.rename({1: 2, 2: 4}, axis='index')
# 修改数据类型
df.rename(index=str) # 传入函数, 修改原索引
# 重新修改索引
replacements = {l1:l2 for l1, l2 in zip(list1, list2)}
df.rename(replacements)
# 列名加前缀
df.rename(lambda x: 't_' + x, axis=1)
# 利用 iter() 函数的 next 特性修改
df.rename(lambda x, y=iter('abcdef'): next(y), axis=1)
# 修改列名,用解包形式生成新旧字段字典
df.rename(columns=dict(zip(df, list('abcd'))))
  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值