05 DataFrame的索引
设置行索引
通过df.index = 可迭代对象
可以设置DataFrame的行索引。要求可迭代对象的元素数量和DataFrame的行数保持一致。
示例代码:
import numpy as np
import pandas as pd
# 通过随机数组创建,列索引和行索引默认是有序整数
score = np.random.randint(40, 100, (10, 5))
df2 = pd.DataFrame(score)
# 指定列索引和行索引
subjects = ["语文", "数学", "英语", "政治", "体育"]
# 通过df2.shape[0] 能够取到行数
stu = ["同学" + str(i) for i in range(df2.shape[0])]
# 设置行索引
df2.index = stu
print(df2)
print("================================")
输出结果:
0 1 2 3 4
同学0 57 60 73 40 64
同学1 81 77 57 65 52
同学2 60 93 99 41 79
同学3 60 89 94 99 76
同学4 81 96 40 74 96
同学5 64 63 81 61 59
同学6 98 94 94 92 74
同学7 65 89 86 60 77
同学8 70 85 91 50 70
同学9 58 45 63 55 50
================================
重置索引
通过df.reset_index()
可以重置索引。重置索引以后,原来的索引列会变成新的一列,新的索引是从0开始的有序整数。
示例代码:
import numpy as np
import pandas as pd
# 通过随机数组创建,列索引和行索引默认是有序整数
score = np.random.randint(40, 100, (10, 5))
df2 = pd.DataFrame(score)
# 指定列索引和行索引
subjects = ["语文", "数学", "英语", "政治", "体育"]
# 通过df2.shape[0] 能够取到行数
stu = ["同学" + str(i) for i in range(df2.shape[0])]
# 设置行索引
df2.index = stu
print(df2)
print("================================")
# 重置索引
df2 = df2.reset_index()
print(df2)
print("================================")
输出结果:
0 1 2 3 4
同学0 95 63 46 94 77
同学1 72 93 68 47 66
同学2 49 41 90 41 49
同学3 52 83 45 66 87
同学4 91 60 79 81 59
同学5 41 96 71 62 74
同学6 43 91 49 73 81
同学7 72 85 71 77 75
同学8 86 49 48 41 52
同学9 76 90 79 58 89
================================
index 0 1 2 3 4
0 同学0 95 63 46 94 77
1 同学1 72 93 68 47 66
2 同学2 49 41 90 41 49
3 同学3 52 83 45 66 87
4 同学4 91 60 79 81 59
5 同学5 41 96 71 62 74
6 同学6 43 91 49 73 81
7 同学7 72 85 71 77 75
8 同学8 86 49 48 41 52
9 同学9 76 90 79 58 89
================================
重置索引并删除原来的所有
如果需要重置索引,又不想要保留原本的索引,则可以通过df.reset_index(drop=True)
方法实现。
示例代码:
import numpy as np
import pandas as pd
# 通过随机数组创建,列索引和行索引默认是有序整数
score = np.random.randint(40, 100, (10, 5))
df2 = pd.DataFrame(score)
# 指定列索引和行索引
subjects = ["语文", "数学", "英语", "政治", "体育"]
# 通过df2.shape[0] 能够取到行数
stu = ["同学" + str(i) for i in range(df2.shape[0])]
# 设置行索引
df2.index = stu
print(df2)
print("================================")
# 重置索引并删除原来的索引
df2 = df2.reset_index(drop=True)
print(df2)
print("================================")
输出结果:
0 1 2 3 4
同学0 50 50 54 82 48
同学1 89 72 89 44 50
同学2 48 83 41 96 63
同学3 85 74 96 74 94
同学4 84 84 92 45 60
同学5 48 74 58 80 41
同学6 72 68 64 62 49
同学7 50 66 90 45 83
同学8 45 55 65 44 72
同学9 49 85 50 84 49
================================
0 1 2 3 4
0 50 50 54 82 48
1 89 72 89 44 50
2 48 83 41 96 63
3 85 74 96 74 94
4 84 84 92 45 60
5 48 74 58 80 41
6 72 68 64 62 49
7 50 66 90 45 83
8 45 55 65 44 72
9 49 85 50 84 49
================================
设置多级索引
pandas的DataFrame支持多级索引,类似于MySQL的联合索引。要设置多级索引,通过以下方法实现:
df = df.set_index(["year", "month"])
示例代码:
import numpy as np
import pandas as pd
df = pd.DataFrame({'month': [1, 4, 7, 10],
'year': [2012, 2014, 2013, 2014],
'sale': [55, 40, 84, 31]})
# 设置多级索引
df = df.set_index(["year", "month"])
print(df)
输出结果:
sale
year month
2012 1 55
2014 4 40
2013 7 84
2014 10 31
多级索引的常用属性
通过以下方式,查看多级索引的名称:
# 查看多级索引的名称
print(df.index.names)
print("================================================")
通过以下方式,查看多级索引的等级:
# 查看多级索引的等级
print(df.index.levels)
print("================================================")
示例代码:
import numpy as np
import pandas as pd
df = pd.DataFrame({'month': [1, 4, 7, 10],
'year': [2012, 2014, 2013, 2014],
'sale': [55, 40, 84, 31]})
# 设置多级索引
df = df.set_index(["year", "month"])
print(df)
print("================================================")
# 查看多级索引
print(df.index)
print("================================================")
# 查看多级索引的名称
print(df.index.names)
print("================================================")
# 查看多级索引的等级
print(df.index.levels)
print("================================================")
输出结果:
sale
year month
2012 1 55
2014 4 40
2013 7 84
2014 10 31
================================================
MultiIndex([(2012, 1),
(2014, 4),
(2013, 7),
(2014, 10)],
names=['year', 'month'])
================================================
['year', 'month']
================================================
[[2012, 2013, 2014], [1, 4, 7, 10]]
================================================
删除指定列
通过以下代码,可以读取csv文件的数据:
df = pd.read_csv("./data/stock_day.csv")
通过以下代码,可以删除DataFrame中指定的列:
df = df.drop(["ma5", "ma10", "ma20", "v_ma5", "v_ma10", "v_ma20"], axis=1)
示例代码:
import pandas as pd
# 读取csv文件数据
df = pd.read_csv("./data/stock_day.csv")
# 查看结构
print(df.head())
print("==============")
# 删除指定列
df = df.drop(["ma5", "ma10", "ma20", "v_ma5", "v_ma10", "v_ma20"], axis=1)
print(df.head())
print("==============")
输出结果:
open high close low volume price_change ... ma10 ma20 v_ma5 v_ma10 v_ma20 turnover
2018-02-27 23.53 25.88 24.16 23.53 95578.03 0.63 ... 22.142 22.875 53782.64 46738.65 55576.11 2.39
2018-02-26 22.80 23.78 23.53 22.80 60985.11 0.69 ... 21.955 22.942 40827.52 42736.34 56007.50 1.53
2018-02-23 22.88 23.37 22.82 22.71 52914.01 0.54 ... 21.929 23.022 35119.58 41871.97 56372.85 1.32
2018-02-22 22.25 22.76 22.28 22.02 36105.01 0.36 ... 21.909 23.137 35397.58 39904.78 60149.60 0.90
2018-02-14 21.49 21.99 21.92 21.48 23331.04 0.44 ... 21.923 23.253 33590.21 42935.74 61716.11 0.58
[5 rows x 14 columns]
==============
open high close low volume price_change p_change turnover
2018-02-27 23.53 25.88 24.16 23.53 95578.03 0.63 2.68 2.39
2018-02-26 22.80 23.78 23.53 22.80 60985.11 0.69 3.02 1.53
2018-02-23 22.88 23.37 22.82 22.71 52914.01 0.54 2.42 1.32
2018-02-22 22.25 22.76 22.28 22.02 36105.01 0.36 1.64 0.90
2018-02-14 21.49 21.99 21.92 21.48 23331.04 0.44 2.05 0.58
==============
通过行列索引获取元素值
示例代码:
import pandas as pd
# 读取csv文件数据
df = pd.read_csv("./data/stock_day.csv")
# 删除指定列
df = df.drop(["ma5", "ma10", "ma20", "v_ma5", "v_ma10", "v_ma20"], axis=1)
print(df.head())
print("==============")
# 通过行索引和列索引,可以获取指定的元素值
value = df["open"]["2018-02-27"]
print(value)
输出结果:
open high close low volume price_change p_change turnover
2018-02-27 23.53 25.88 24.16 23.53 95578.03 0.63 2.68 2.39
2018-02-26 22.80 23.78 23.53 22.80 60985.11 0.69 3.02 1.53
2018-02-23 22.88 23.37 22.82 22.71 52914.01 0.54 2.42 1.32
2018-02-22 22.25 22.76 22.28 22.02 36105.01 0.36 1.64 0.90
2018-02-14 21.49 21.99 21.92 21.48 23331.04 0.44 2.05 0.58
==============
23.53
通过行列索引切片获取某个区域的值
示例代码:
import pandas as pd
# 读取csv文件数据
df = pd.read_csv("./data/stock_day.csv")
# 删除指定列
df = df.drop(["ma5", "ma10", "ma20", "v_ma5", "v_ma10", "v_ma20"], axis=1)
print(df.head())
print("==============")
# 通过通过行列索引切片,可以获取某个区域的值
df1 = df.loc["2018-02-27":"2018-02-14", "open":"close"]
print(df1)
输出结果:
open high close low volume price_change p_change turnover
2018-02-27 23.53 25.88 24.16 23.53 95578.03 0.63 2.68 2.39
2018-02-26 22.80 23.78 23.53 22.80 60985.11 0.69 3.02 1.53
2018-02-23 22.88 23.37 22.82 22.71 52914.01 0.54 2.42 1.32
2018-02-22 22.25 22.76 22.28 22.02 36105.01 0.36 1.64 0.90
2018-02-14 21.49 21.99 21.92 21.48 23331.04 0.44 2.05 0.58
==============
open high close
2018-02-27 23.53 25.88 24.16
2018-02-26 22.80 23.78 23.53
2018-02-23 22.88 23.37 22.82
2018-02-22 22.25 22.76 22.28
2018-02-14 21.49 21.99 21.92
通过行列索引下标切片获取某个区域的值
示例代码:
import pandas as pd
# 读取csv文件数据
df = pd.read_csv("./data/stock_day.csv")
# 删除指定列
df = df.drop(["ma5", "ma10", "ma20", "v_ma5", "v_ma10", "v_ma20"], axis=1)
print(df.head())
print("==============")
# 通过通过行列索引下标切片,可以获取某个区域的值
df1 = df.iloc[:5, :3]
print(df1)
输出结果:
open high close low volume price_change p_change turnover
2018-02-27 23.53 25.88 24.16 23.53 95578.03 0.63 2.68 2.39
2018-02-26 22.80 23.78 23.53 22.80 60985.11 0.69 3.02 1.53
2018-02-23 22.88 23.37 22.82 22.71 52914.01 0.54 2.42 1.32
2018-02-22 22.25 22.76 22.28 22.02 36105.01 0.36 1.64 0.90
2018-02-14 21.49 21.99 21.92 21.48 23331.04 0.44 2.05 0.58
==============
open high close
2018-02-27 23.53 25.88 24.16
2018-02-26 22.80 23.78 23.53
2018-02-23 22.88 23.37 22.82
2018-02-22 22.25 22.76 22.28
2018-02-14 21.49 21.99 21.92
通过下标和索引混合获取某区域值
示例代码:
import pandas as pd
# 读取csv文件数据
df = pd.read_csv("./data/stock_day.csv")
# 删除指定列
df = df.drop(["ma5", "ma10", "ma20", "v_ma5", "v_ma10", "v_ma20"], axis=1)
print(df.head())
print("==============")
# 通过下标和索引混合获取某区域值
# 方法1,将下标转为索引
df2 = df.loc[df.index[0:5], ["open", "close"]]
print(df2)
print("==============")
# 方法2,将索引转为下标
df3 = df.iloc[0:5, df.columns.get_indexer(["open", "close"])]
print(df3)
print("==============")
输出结果:
open high close low volume price_change p_change turnover
2018-02-27 23.53 25.88 24.16 23.53 95578.03 0.63 2.68 2.39
2018-02-26 22.80 23.78 23.53 22.80 60985.11 0.69 3.02 1.53
2018-02-23 22.88 23.37 22.82 22.71 52914.01 0.54 2.42 1.32
2018-02-22 22.25 22.76 22.28 22.02 36105.01 0.36 1.64 0.90
2018-02-14 21.49 21.99 21.92 21.48 23331.04 0.44 2.05 0.58
==============
open close
2018-02-27 23.53 24.16
2018-02-26 22.80 23.53
2018-02-23 22.88 22.82
2018-02-22 22.25 22.28
2018-02-14 21.49 21.92
==============
open close
2018-02-27 23.53 24.16
2018-02-26 22.80 23.53
2018-02-23 22.88 22.82
2018-02-22 22.25 22.28
2018-02-14 21.49 21.92
==============
原文始发于微信公众号(张大鹏520):你知道pandas的索引可以做哪些操作吗?如何设置多级索引呢?
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/48674.html