楼主: zwy_0309
1998 7

Pandas Frame 基础知识——数据选择(笔记) [推广有奖]

  • 1关注
  • 3粉丝

硕士生

36%

还不是VIP/贵宾

-

威望
0
论坛币
342 个
通用积分
99.1487
学术水平
11 点
热心指数
9 点
信用等级
7 点
经验
4173 点
帖子
69
精华
0
在线时间
148 小时
注册时间
2019-6-4
最后登录
2024-3-29

相似文件 换一批

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

求职就业群
赵安豆老师微信:zhaoandou666

经管之家联合CDA

送您一个全额奖学金名额~ !

感谢您参与论坛问题回答

经管之家送您两个论坛币!

+2 论坛币
首先,在使用前导入Pandas库,并导入DataFrame类,方法如下:

import pandas as pd
from pandas import DataFrame

data={'ID':['01','02','03','04','05','06','07'],
      'name':['张三','李四','王五','赵六','田七','陈八','刘九'],
      'gender':[True,False,True,False,True,False,True],
      'age':[20,18,19,18,13,17,19],
      'height':[1.88,1.68,1.78,1.59,1.70,1.60,1.71]
}
frame = DataFrame(data)

其实对应的表如下:
5.png

一、引用列
方法1:frame.name                       ----只引用name列
           注意:这样会出歧义
方法2:frame[['name','age']]          --用方括号引用列名
方法3:frame.loc[:,['name']]          ---第一个冒号,表示所有行。所有行的name列,即name列
           frame.loc[:,['name','age']]   ---取name和age列



二、引用行
方法1:frame[0:1]          ---0、1是行的序号
           frame[2:4]          ---取第2行开始到第4行,但不含第4行
           frame[2:7:2]       ---取第2、4、6行,最后一个2是指间隔2行

方法2:frame.loc[1]        ---这里的1是索引号    【结果】是李四所在的行
           frame.loc[1:3]     ---表示取多行,包含索引3
           frame.loc[[1,3]]   ---通过逗号选择多个不连续的行

举例:frame1 = DataFrame(data,index=[101,102,103,104,105,106,107]) 改变索引号
          print(frame1[0:1])                ---打印出第0行,‘张三’所在的行
          print(frame1[101:103])         ---没有101、102行,所以打印出空行
          print(frame1.loc[0:1])           ---没有索引为0、1的行,所以打印空行
          print(frame1.loc[101:103])    ---打印出101、102、103所在的行      


三、引用行列
1)frame['name'][1:2] 等价于frame[1:2]['name']   ---第1行name列的值  
      结果:李四
2)  frame[5:6,['age','height']]    ---索引5、6行的age、height列

3)  frame.iloc[1,3]          ---第2行,第4列,注意这里又完全按序号选择
      frame.iloc[1:2,0:3]    ---第2行,前三列,不包含最后的序号
      frame.iloc[[3,1],[0,2]] ---第4、2行,第1、3列

方法3:增加条件(难点)
          frame[frame['age']>17]  ---年龄大于17的所有行
          frame[frame['age']>17 & frame['height']>1.80]   ---年龄大于17且身高大于1.80
          [修正]这个方法有点害人,不知什么原因,真正使用时还是会报错,应该修改为:
          frame.loc[frame['age']>17 & frame['height']>1.80]   ---年龄大于17且身高大于1.80

           frame[frame['age'].isin([20,16])]     ---年龄为16或20的
           frame['name'][[2,3]][(frame['height']>1.7)]   --选择第2条和第3条且身高大于1.7 的姓名  【结果】王五
        

二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

关键词:pandas panda Frame 数据选择 基础知识

沙发
zwy_0309 在职认证  发表于 2020-9-3 13:37:46 |只看作者 |坛友微信交流群
今天才发现,在同时选择行时,如果用frame[行]的方法,其中的行只能用切片形式。比如,选择第1行,如果写成frame[0],则系统会报错:_maybe_cast_indexer,应该是传入错误索引的意思吧,修改为frame[0:1],则OK。

使用道具

藤椅
zwy_0309 在职认证  发表于 2020-10-24 17:58:32 |只看作者 |坛友微信交流群
引用列,还可以使用 frame[frame.columns[列号n]]

使用道具

板凳
zwy_0309 在职认证  发表于 2020-12-11 16:08:39 |只看作者 |坛友微信交流群
使用时发现,如果想获取某个单元格的值,则应该用get_value()
使用方法:
a = df.get_value(row_index, column_name)

使用道具

报纸
zwy_0309 在职认证  发表于 2020-12-11 16:16:00 |只看作者 |坛友微信交流群
zwy_0309 发表于 2020-12-11 16:08
使用时发现,如果想获取某个单元格的值,则应该用get_value()
使用方法:
a = df.get_value(row_index, c ...
用get_value()会有警告提示,用df.loc(1,'列名'),就会顺利通过,不报任何错误。

使用道具

地板
zwy_0309 在职认证  发表于 2021-1-3 18:42:20 |只看作者 |坛友微信交流群
透视表的多层列索引的解读 多层索引的解读.png

使用道具

7
novelbean 发表于 2021-1-7 14:36:36 |只看作者 |坛友微信交流群
frame[5:6,['age','height']]    ---索引5、6行的age、height列 这一句写错了,应该为
frame.loc[5:6,:][['age','height']]

使用道具

8
novelbean 发表于 2021-1-7 14:42:15 |只看作者 |坛友微信交流群
frame[frame['age']>17 & frame['height']>1.80] 改为frame[(frame['age']>17) & (frame['height']>1.80)]
frame.loc[frame['age']>17 & frame['height']>1.80] 改为frame.loc[(frame['age']>17) & (frame['height']>1.80)]  或frame.loc[(frame['age']>17) & (frame['height']>1.80),:] 都能得到

ID name  gender  age  height
0  01   张三    True   20    1.88

相同的结果

使用道具

9
zwy_0309 在职认证  发表于 2021-1-7 23:44:11 |只看作者 |坛友微信交流群
novelbean 发表于 2021-1-7 14:42
frame[frame['age']>17 & frame['height']>1.80] 改为frame[(frame['age']>17) & (frame['height']>1.80)]
...
您真细心 ,使用这个例子调试结果确实是相同的,但我将方法用到另一个脚本中时,结果一直报错,调成.loc方式后问题解决,我也感觉很奇怪。我再研究一下,有新进展回复

使用道具

10
zwy_0309 在职认证  发表于 2021-8-18 13:42:12 |只看作者 |坛友微信交流群
今天学到怎样模糊筛选数据,用.str.contains(),  其中有多个筛选条件时,用"|"分隔,但需要在“”内部写分隔符。
mid_dx =mid_dx.loc[mid_dx['保单号'].str.contains('PDAA|PDZA')]

使用道具

您需要登录后才可以回帖 登录 | 我要注册

本版微信群
加好友,备注cda
拉您进交流群

京ICP备16021002-2号 京B2-20170662号 京公网安备 11010802022788号 论坛法律顾问:王进律师 知识产权保护声明   免责及隐私声明

GMT+8, 2024-4-26 21:55