Skip to content

Pandas 索引

pandas 的索引 index 的用途

使用index 查询数据

python
# drop == False, 让索引列还保持在column
df.set_index("xxx", inplace=True, drop=False)  #drop=False:表示保留索引列,并将其作为新的DataFrame的一个普通列。
# 使用index 查询
df.loc[xxx].head(x)

# 注意: 使用index 会提升查询性能
使用index 查询 需要优先对 index 进行排序  否则查询复杂度会很高,耗时长

# 将数据随机打散
from sklearn.utils import shuffle  #shuffle函数用于将数据集随机打乱。
df_shuffle = shuffle(df)

# 将index 进行排序
df_sort = df_shuffle.sort_index()  # 默认为升序
df_sort = df_shuffle.sort_index(ascending=False)  #索引改为降序

# 检查索引是否为递增
df_shuffle.index.is_monotonic_increasing
# 检查索引是否唯一  如果不是唯一 则会使用二分法查询
df_shuffle.index.is_unique
# 计时,查询id=500 的数据查询性能
%timeit df_shuffle.loc[500]

总结:
%timeit 是一个Python魔法命令,用于计算代码执行所需的时间。

使用index 自动对齐数据

python
import pandas as pd
s1 = pd.Series([1,2,3], index=list("abc"))
s2 = pd.Series([2,3,4], index=list("bcd"))
s1 +s2
a    NaN
b    4.0
c    6.0
d    NaN
dtype: float64

pandas的分层索引

pandas 的分层索引 Multilndex

  • 分层索引:在一个轴向上拥有多个索引层级,可以表达更高维度的数据形式
  • 可以更方便的进行数据筛选,如果有序,则性能更好
  • groupby等操作的结果,如果是多key,结果是分层索引,需要会使用
  • 一般不需要自己创建分层索引(multilndex有构造函数,但一般不用)
python
import pandas as pd
%matplotlib inline

stock_history = pd.read_csv('./quotefile/股票历史数据.csv')
日期公司收盘开盘交易量涨跌幅
02024/3/22IQY4.044.044.143.967.51-0.0074
12024/3/21IQY4.074.114.224.075.00-0.0216
22024/3/20IQY4.164.004.163.996.690.0532
32024/3/19IQY3.953.903.993.855.24-0.0075
42024/3/18IQY3.984.094.093.945.44-0.0050
...........................
752024/3/1JD23.0023.0023.2722.8513.000.0168
762024/2/29JD22.6222.8523.1122.5214.57-0.0083
772024/2/28JD22.8123.3323.4022.7715.19-0.0527
782024/2/27JD24.0824.0724.3523.939.340.0160
792024/2/26JD23.7023.7724.0223.596.75-0.0084

80 rows × 8 columns

Series的分层索引 Multilndex

python
ser = stock_history.groupby(['公司', '日期'])['收盘'].mean()
ser

# unstack 把二级索引变成列
ser.unstack()
日期2024/2/262024/2/272024/2/282024/2/292024/3/12024/3/112024/3/122024/3/132024/3/142024/3/152024/3/182024/3/192024/3/202024/3/212024/3/222024/3/42024/3/52024/3/62024/3/72024/3/8
公司
BABA76.5177.6874.5974.0374.6274.8676.0676.3973.4073.4273.5273.4274.1873.8372.1372.0072.0773.7172.5473.55
BAIDU110.59112.36103.31101.33104.02101.29105.27107.89104.64103.86104.77104.17103.89101.70102.18100.7298.2599.3897.8198.27
IQY3.513.673.673.693.824.074.304.164.004.003.983.954.164.074.043.643.453.733.773.94
JD23.7024.0822.8122.6223.0026.0727.3728.0127.0527.4527.8527.5928.1427.0526.5021.8821.4424.9123.9924.75

Series 有多层索引 multilndex 怎样筛选数据

python
ser.loc['BAIDU']

ser.loc[:, '2024/2/26']

# 多层索引,可以用元组的形式筛选
ser.loc[('BAIDU', '2024/2/26')]

DF 的多层索引 multilndex 以及如何筛选数据

注意: 在选择数据时

  • 列表'[key1, key2]' 代表同一层的多个key

  • 元组(key1, key2)代表多层索引

python
stock_history.set_index(['公司', '日期'], inplace=True)
stock_history
收盘开盘交易量涨跌幅
公司日期
IQY2024/3/224.044.044.143.967.51-0.0074
2024/3/214.074.114.224.075.00-0.0216
2024/3/204.164.004.163.996.690.0532
2024/3/193.953.903.993.855.24-0.0075
2024/3/183.984.094.093.945.44-0.0050
........................
JD2024/3/123.0023.0023.2722.8513.000.0168
2024/2/2922.6222.8523.1122.5214.57-0.0083
2024/2/2822.8123.3323.4022.7715.19-0.0527
2024/2/2724.0824.0724.3523.939.340.0160
2024/2/2623.7023.7724.0223.596.75-0.0084

80 rows × 6 columns

python
stock_history.sort_index(inplace=True)
stock_history
收盘开盘交易量涨跌幅
公司日期
BABA2024/2/2676.5175.6276.5775.3413.900.0072
2024/2/2777.6877.5378.0577.2514.390.0153
2024/2/2874.5976.0276.1874.4516.80-0.0398
2024/2/2974.0374.6875.0473.8012.44-0.0075
2024/3/174.6274.4875.0974.3711.980.0080
........................
JD2024/3/421.8822.7922.8321.6028.39-0.0487
2024/3/521.4421.3421.6721.1818.28-0.0201
2024/3/624.9124.8525.6724.3354.340.1618
2024/3/723.9924.5224.5423.6517.45-0.0369
2024/3/824.7523.8724.9523.7826.010.0317

80 rows × 6 columns

python
stock_history.loc['BAIDU'] # 筛选第一层索引
stock_history.loc[(['BAIDU','JD'], '2024/2/27'), :]  # 第一层 百度和京东  第二层 日期 返回所有值

# slice(None) 代表筛选索引的所有内容
stock_history.loc[(slice(None), ['2024/2/28','2024/2/29']),:]
收盘开盘交易量涨跌幅
公司日期
BABA2024/2/2874.5976.0276.1874.4516.80-0.0398
2024/2/2974.0374.6875.0473.8012.44-0.0075
BAIDU2024/2/28103.31107.85108.09103.2511.32-0.0805
2024/2/29101.33103.07104.00100.857.12-0.0192
IQY2024/2/283.673.893.953.5721.160.0000
2024/2/293.693.703.903.6217.090.0054
JD2024/2/2822.8123.3323.4022.7715.19-0.0527
2024/2/2922.6222.8523.1122.5214.57-0.0083

© 2023-2024 LiuJingcheng. 保留所有权利。