文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

pandas---Series与DataFrame索引、切片;多层索引、索引的堆叠

2023-09-09 10:09

关注

1. Series的索引和切片

1.1 Series的索引:

可以使用中括号取单个索引(此时返回的是元素类型),或者中括号里一个列表取多个索引(此时

返回的仍然是一个Series类型)。分为显示索引和隐式索引:

(1) 显式索引:

使用index中的元素作为索引值

使用.loc[ ]

s = pd.Series({'Python': 150, 'NumPy': 100, 'Pandas': 130})sNumPy     100Pandas    130Python    150dtype: int64# 显示索引: 使用索引名print(s['Python'])   # 值,int类型print(s.NumPy)# 使用2个中括号得到的类型:Series # 一次取多个元素s[['Pandas', 'NumPy']] s[['Pandas']]# 使用 loc[]print(s.loc['Python'])print(s.loc[['Pandas', 'NumPy']])s.loc[['Pandas']]150100150Pandas    130NumPy     100dtype: int64Pandas    130dtype: int64

(2) 隐式索引:

使用整数作为索引值

使用.iloc[ ]

# 隐式索引:使用数字下标print(s[0])print(s[[0, 2]])print(s[[0]])# 使用 iloc[]s.iloc[0]print(s.iloc[[0, 2]])print(s.iloc[[0]])# 下面这2个写法是错误的# s.iloc['Python']# s.loc[0]100NumPy     100Python    150dtype: int64NumPy    100dtype: int64NumPy     100Python    150dtype: int64NumPy    100dtype: int64

1.2 Series的切片

s = pd.Series({    '语文': 100,     '数学': 150,    '英语': 110,    'Python': 130,    'Pandas': 150,    'NumPy': 150})# 切片# Series是一维数组# 隐式切片:  左闭右开s[1 : 4]s.iloc[1 : 4]# 显式切片: 左闭右闭s['数学' : 'Python']s.loc['数学' : 'Python']数学        150英语        110Python    130dtype: int64

2. DataFrame的索引与切片

2.1 DataFrame的索引

(1) 对列进行索引:

通过类似字典的方式;通过属性的方式。

可以将DataFrame的列获取为一个Series。返回的Series拥有原DataFrame相同的索引,且name

属性也已经设置好了,就是相应的列名。

df = pd.DataFrame(    data=np.random.randint(10, 100, size=(4, 6)),    index=['小明', '小红', '小黄', '小绿'],    columns=['语文', '数学', '英语', '化学', '物理', '生物'])df.语文  # Series类型df['语文']# 使用2个中括号得到的类型:DataFramedf[['语文', "化学"]]df[['语文']]

 (2) 对行进行索引:

使用.loc[ ]加index来进行行索引

使用.iloc[ ]加整数来进行行索引

同样返回一个Series,index为原来的columns。

# 不可以直接取行索引# df['小明']# df.小明# DataFrame默认是先取列索引# 取行索引print(df.loc['小明'])  # Series类型df.iloc[0] # 使用两个中括号: DataFrame类型print(type(df.loc[['小明', '小绿']]))df.loc[['小明']]print(df.iloc[[0, -1]])df.iloc[[0, 3]]df.iloc[[0]]

(3) 对元素索引的方法:

使用列索引;使用行索引(iloc[3,1]相当于两个参数;iloc[[3,3]] 里面的[3,3]看做一个参数);

使用values属性(二维NumPy数组)。

# 先取列,再取行print(df['语文']['小明'])df['语文'][0]df.语文[0]df.语文.小明# 先取行,再取列df.loc['小明']['语文']df.loc['小明'][0]print(df.iloc[0][0])df.iloc[0]['语文']df.iloc[0, 0]df.loc['小明', '语文']363636

2.2 DataFrame的切片

直接用中括号时:

索引优先对列进行操作;切片优先对行进行操作

# 行切片print(df[1: 3])   # 左闭右开 df['小红' : '小黄']  # 左闭右闭print(df.iloc[1: 3])   # 左闭右开 df.loc['小红' : '小黄']  # 左闭右闭

# 列切片#   对列做切片,也必须先对行切片df.iloc[ : , 1: 4]df.loc[:, "数学": "化学"]

总结:

取一行或一列 : 索引;取连续的多行或多列 : 切片;取不连续的多行或多列 : 中括号

3. 多层索引操作

(1) 隐式构造

最常见的方法是给DataFrame构造函数的index参数传递两个或更多的数组

data = np.random.randint(0, 100, size=(6, 6))index = [    ['1班',  '1班',   '1班',  '2班', '2班', '2班'],    ['张三', '李四', '王五', '鲁班', '张三丰', '张无忌']]columns = [    ['期中', '期中', '期中', '期末', '期末', '期末'],    ['语文', '数学', '英语', '语文', '数学', '英语']]df = pd.DataFrame(data=data, index=index, columns=columns)

Series也可以创建多层索引:

data = np.random.randint(0, 100, size=6)index = [    ['1班',  '1班',   '1班',  '2班', '2班', '2班'],    ['张三', '李四', '王五', '鲁班', '张三丰', '张无忌']]s = pd.Series(data=data, index=index)

(2) 显示构造pd.MultiIndex

使用数组:

data = np.random.randint(0, 100, size=(6, 6))index = pd.MultiIndex.from_arrays( [    ['1班',  '1班',   '1班',  '2班', '2班', '2班'],    ['张三', '李四', '王五', '鲁班', '张三丰', '张无忌']])columns = [    ['期中', '期中', '期中', '期末', '期末', '期末'],    ['语文', '数学', '英语', '语文', '数学', '英语']]df = pd.DataFrame(data=data, index=index, columns=columns)df

 使用tuple:

data = np.random.randint(0, 100, size=(6, 6))index = pd.MultiIndex.from_tuples(     (        ('1班', '张三'), ('1班', '李四'), ('1班', '王五'),         ('2班', '鲁班'), ('2班', '张三丰'), ('2班', '张无忌')    ))columns = [    ['期中', '期中', '期中', '期末', '期末', '期末'],    ['语文', '数学', '英语', '语文', '数学', '英语']]df = pd.DataFrame(data=data, index=index, columns=columns)df

使用product:

data = np.random.randint(0, 100, size=(6, 6))# 笛卡尔积: {a, b} {c, d} => {a, c}, {a, d}, {b, c}, {b, d}index = pd.MultiIndex.from_product( [    ['1班',  '2班'],    ['张三', '李四', '王五']])columns = [    ['期中', '期中', '期中', '期末', '期末', '期末'],    ['语文', '数学', '英语', '语文', '数学', '英语']]df = pd.DataFrame(data=data, index=index, columns=columns)df

注意:除了行索引index,列索引columns也能用同样的方法创建多层索引

4. 多层索引对象的索引与切片

4.1 Series的操作

对于Series来说,直接中括号[]与使用.loc()完全一样

索引:

# 显式索引s['1班']s.loc['1班']s[['1班']]s[['1班', '2班']]s['1班']['张三']s.loc['1班']['张三']s.loc['1班', '张三']s['1班', '张三']# 隐式索引s[0]s[1]s.iloc[1]s.iloc[[1, 2]]

切片: 

# 切片# 显式切片s['1班' : '2班']s.loc['1班' : '2班']s.loc['1班'][:]# 建议使用隐式索引s[1 : 5]s.iloc[1 : 5]1班  李四     84    王五     142班  鲁班     64    张三丰    32dtype: int32

4.2 DataFrame的操作

索引:

# 列索引df['期中']df['期中'][['数学']]df['期中']['数学']df['期中', '数学']df.期中.数学df.iloc[:, 2]df.iloc[:, [0, 2, 1]]df.loc[:, ('期中', '数学')]# 行索引df.loc['2班']df.loc['2班'].loc['张三']df.loc['2班', '张三']df.loc[('2班', '张三')]df.iloc[1]df.iloc[[1]]df.iloc[[1, 3, 4, 2]]

获取元素: 

# 获取元素df['期中']['数学']['1班']['张三']df['期中']['数学']['1班'][0]df.iloc[0, 1]df.loc[('1班', '张三'), ('期中', '数学')]72

 切片:

# 行切片df.iloc[1 : 5]df.loc[('1班', '李四') : ('2班', '李四')]df.loc['1班' : '2班']# 列切片df.iloc[:, 1: 5]df.loc[:, '期中': '期末']# df.loc[:, ('期中', '数学') : ('期末', '数学')]  # 报错# 建议切片使用隐式索引

 5. 索引的堆叠

stack():使用stack()的时候,level等于哪一个,哪一个就消失,出现在行里。

unstack():使用unstack()的时候,level等于哪一个,哪一个就消失,出现在列里。

# stack: 将列索引变成行索引df.stack()   # 默认是将最里层的列索引变成行索引df.stack(level=-1)df.stack(level=1)df2 = df.stack(level=0)df2

 

# unstack: 将行索引变成列索引df2.unstack()df2.unstack(level=-1)df2.unstack(level=2)df2.unstack(level=1)df2.unstack(level=0)

 使用fill_value填充:

df.unstack()df.unstack(fill_value=0)

 

 

来源地址:https://blog.csdn.net/weixin_43961909/article/details/131155365

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯