你知道pandas的索引可以做哪些操作吗?如何设置多级索引呢?

05 DataFrame的索引

设置行索引

通过df.index = 可迭代对象可以设置DataFrame的行索引。要求可迭代对象的元素数量和DataFrame的行数保持一致。

示例代码:

import numpy as np
import pandas as pd

# 通过随机数组创建,列索引和行索引默认是有序整数
score = np.random.randint(40100, (105))
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(40100, (105))
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(40100, (105))
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': [14710],
                   'year': [2012201420132014],
                   'sale': [55408431]})

# 设置多级索引
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': [14710],
                   'year': [2012201420132014],
                   'sale': [55408431]})

# 设置多级索引
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

(0)
小半的头像小半

相关推荐

发表回复

登录后才能评论
极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!