Python-Pandas{数据结构与基本功能}

  博客文章内需要的文件: 文件

 pandas学习路线:

Python-Pandas{数据结构与基本功能
Python-Pandas{描述与统计功能}
Python-pandas{缺失值处理}
Python-pandas{文本数据处理}
Python-pandas{数据分组}

  Pandas通常是用于数据分析过程中, 数据的清洗, 数据预处理, 数据的描述性分析等过程中。在整个Python数据分析的生态环境中, Pandas的地位非常重要, 利用Pandas可以快速便捷的对数据进行各种各样的处理与操作.

  在Pandas中, 最重要的两种数据结构是1维的Series和2维的DataFrame.

  • Series:一维数组,与Numpy中的一维array类似。二者与Python基本的数据结构List也很相近。

 Series中能保存不同种数据类型,字符串、boolean值、数字等都能保存在Series中。但是每个Series中只能保存一种数据结构.

  • DataFrame:二维的表格型数据结构。有多个Series共同构成的集合就变成DataFrame.

Pandas是基于Numpy的一个数据分析包, 它里面的内核是Numpy,可以将Pandas理解为: 一个课编程版的EXCEL

# 导入相关库
import numpy as np
import pandas as pd

Series

  Series 是一个带有 名称索引 的一维数组

 既然是数组,肯定要说到的就是数组中的元素类型,在 Series 中包含的数据类型可以是整数、浮点、字符串、Python对象等。

手动构建Series

  假定有一个场景是:存储一些用户的信息,暂时只包括年龄信息。

  我们可以通过 Series 来存储,这里我们通过 Series 存储了五个年龄:22, 3000, 33, 37, 40, 1500,只需将要存储的数据构建成一个数组,然后赋值给data参数即可。

  用函数或者类将,构建Series

  • 参数说明
    • data=None, 数据
    • index=None, 索引
    • dtype=None, 数据类型
    • name=None, 列名称
L = [22, 3000, 33, 37, 40, 1500]]
s = pd.Series(L)
print(s)
'''
0      22
1    3000
2      33
3      37
4      40
5    1500
dtype: int64
'''
# 使用Series类创建Series对象
test = pd.Series(data)
# 输出test,是一样的结果


#  还可以对Series进行一些拓展
L2 = ['蜘蛛侠', '灭霸', '奇异博士', '钢铁侠', '蝙蝠侠', '索尔']
s = pd.Series(L,index=L2,dtype='float' ,name='英雄年龄')
print(s)
'''
蜘蛛侠       22.0
灭霸      3000.0
奇异博士      33.0
钢铁侠       37.0
蝙蝠侠       40.0
索尔      1500.0
Name: 英雄年龄, dtype: float64
'''
print(s.name) # 提取名称
# 英雄年龄

print(s.index) # 提取索引
# Index(['蜘蛛侠', '灭霸', '奇异博士', '钢铁侠', '蝙蝠侠', '索尔'], dtype='object')

print(s.values) # 其取值
# [  22. 3000.   33.   37.   40. 1500.]

s.index.name = '英雄姓名'
print(s)
'''
英雄姓名
蜘蛛侠       22.0
灭霸      3000.0
奇异博士      33.0
钢铁侠       37.0
蝙蝠侠       40.0
索尔      1500.0
Name: 英雄年龄, dtype: float64
'''
s.name = 'Hero Age' # 我们可以通过赋值的方式给该属性传一个值, 或者改变原来的值
print(s)
'''
英雄姓名
蜘蛛侠       22.0
灭霸      3000.0
奇异博士      33.0
钢铁侠       37.0
蝙蝠侠       40.0
索尔      1500.0
Name: Hero Age, dtype: float64
'''

Series的索引和切片

  非常非常高级的数据类型,所以它的索引和切片方法也非常非常多.

 体现: 它把我们之前学过的不同数据类型的索引和切片给集成到一块。既可以当做是列表索引,也可以当做字典索引

按照字典的方式进行索引和切片

  对于 Series 的索引和切片,我们可以有两种思路,一种是把它当做是一个字典,索引就是字典的 key,数据就是字典的 value。

  1. 首先我们先来回忆一下字典的索引方式。
d = {'a':111, 'b':222,'c':333}
print(d)
'''
{'a': 111, 'b': 222, 'c': 333}

''' 
print(d['b'])
'''
222
'''
  1. 其实矩阵数组的索引方式也是一样的
import pandas as pd
L = [22, 3000, 33, 37, 40, 1500]
s = pd.Series(L)
print(s)
'''
0      22
1    3000
2      33
3      37
4      40
5    1500
dtype: int64
'''
L2 = ['蜘蛛侠', '灭霸', '奇异博士', '钢铁侠', '蝙蝠侠', '索尔']
s = pd.Series(L,index=L2,dtype='float' ,name='英雄年龄')
print(s)
'''
蜘蛛侠       22.0
灭霸      3000.0
奇异博士      33.0
钢铁侠       37.0
蝙蝠侠       40.0
索尔      1500.0
Name: 英雄年龄, dtype: float64
'''
print(s['钢铁侠'])
'''
37.0
'''
print(s.get('冰封侠','没有'))  # 判断是否有冰封家的索引,如果有把vlaue输出,如果没有输出没有
'''
没有
'''
print(s['奇异博士':'蝙蝠侠']) # 这里是有字典不同的地方,字典的范围索引是 左闭右开区间,那数组矩阵是左必右闭区间
'''
奇异博士    33.0
钢铁侠     37.0
蝙蝠侠     40.0
Name: 英雄年龄, dtype: float64
'''
# 我们也可以设置步长
print(s['灭霸':'索尔':2])
'''
灭霸     3000
钢铁侠      37
索尔     1500
Name: 英雄年龄, dtype: int64
'''

# 我们也可以同样修改value的值
s['蜘蛛侠'] = 24
print(s)
'''
蜘蛛侠       24.0
灭霸      3000.0
奇异博士      33.0
钢铁侠       37.0
蝙蝠侠       40.0
索尔      1500.0
Name: 英雄年龄, dtype: float64
'''
# 同时修改钢铁侠和蝙蝠侠的年龄
s['钢铁侠':'蝙蝠侠'] = 39,42


  1. 字典索引方式 : 比如说:显示索引 蜘蛛侠, 灭霸
    列表索引方式 : 比如说:隐式索引 [0,1,2,3,4,5]
print(s)
'''
蜘蛛侠       24.0
灭霸      3000.0
奇异博士      33.0
钢铁侠       37.0
蝙蝠侠       40.0
索尔      1500.0
Name: 英雄年龄, dtype: float64
'''
print(s[0:1])
'''
蜘蛛侠    24
Name: 英雄年龄, dtype: int64
'''
#  这个时候,我们就可以发现隐式索引,是左闭右开区间的
print(s[1:4])
'''
灭霸      3000.0
奇异博士      33.0
钢铁侠       37.0
Name: 英雄年龄, dtype: float64
'''
print(s[3:])
'''
钢铁侠       37.0
蝙蝠侠       40.0
索尔      1500.0
Name: 英雄年龄, dtype: float64
'''
print(s[0])
'''
24.0
'''

# 我们发现当[]只有一个值的时候,提取出来的是,vlaues


# 也可以倒着来
print(s[-1])
'''
1500.0
'''

 我们发现这样操作有一定的局限性,就是说,根据索引所提取出来的values是连续的。那么我们是否有一定的办法来提取间断的values呢?

  1. 传入索引值序列的方式提取数据
import pandas as pd
L = [22, 3000, 33, 37, 40, 1500]
s = pd.Series(L)
L2 = ['蜘蛛侠', '灭霸', '奇异博士', '钢铁侠', '蝙蝠侠', '索尔']
s = pd.Series(L,index=L2,dtype='float' ,name='英雄年龄')
print(s)
'''
蜘蛛侠       22.0
灭霸      3000.0
奇异博士      33.0
钢铁侠       37.0
蝙蝠侠       40.0
索尔      1500.0
Name: 英雄年龄, dtype: float64
'''
print(s[ ['蜘蛛侠','蝙蝠侠','索尔'] ])
'''
蜘蛛侠      22.0
蝙蝠侠      40.0
索尔     1500.0
Name: 英雄年龄, dtype: float64
'''
#  我们发现这样的方式,可以实现间断提取
#这样的方式下 我们可以实现重复提取
print(s[['索尔','蝙蝠侠','蝙蝠侠']])
'''
索尔     1500
蝙蝠侠      40
蝙蝠侠      40
Name: 英雄年龄, dtype: int64
'''
# 隐世索引提取
print(s[[0,1,4]])
'''
蜘蛛侠      24
灭霸     3000
蝙蝠侠      40
Name: 英雄年龄, dtype: int64
'''
# 同样的隐世索引 也可以实现重复提取
print(s[[0,0,0]])

增加数据和删除数据

  • 增加数据

  其实和字典新增数据是一样的

# 新增一个数据
s['闪电侠']  = 21
print(s)
'''
蜘蛛侠       22.0
灭霸      3000.0
奇异博士      33.0
钢铁侠       37.0
蝙蝠侠       40.0
索尔      1500.0
闪电侠       21.0
Name: 英雄年龄, dtype: float64
'''
  • 删除数据
    .pop()可以弹出指定数据
    .drop() 可以删除指定数据
print(s)
'''
蜘蛛侠       22.0
灭霸      3000.0
奇异博士      33.0
钢铁侠       37.0
蝙蝠侠       40.0
索尔      1500.0
闪电侠       21.0
Name: 英雄年龄, dtype: float64
'''
print(s.pop('闪电侠'))
'''
21.0
'''
print(s)
'''
蜘蛛侠       22.0
灭霸      3000.0
奇异博士      33.0
钢铁侠       37.0
蝙蝠侠       40.0
索尔      1500.0
Name: 英雄年龄, dtype: float64
'''
# 我们发现.pop()可以提取数据,但是提取,则在原数据上,删除了提取的数据。


# 删除
print(s.drop('灭霸'))
'''
奇异博士      33.0
钢铁侠       37.0
蝙蝠侠       40.0
索尔      1500.0
Name: 英雄年龄, dtype: float64
'''
print(s)
'''
灭霸      3000.0
奇异博士      33.0
钢铁侠       37.0
蝙蝠侠       40.0
索尔      1500.0
Name: 英雄年龄, dtype: float64
'''
# 我们发现使用.drop指令,会生成了新的副本,而原有的数据不会改变


# 一次删除多个
s2 = s.drop(['灭霸','索尔','蝙蝠侠'])

# 重点 : 参数inplace 为Ture就是直接在原数据中进行修改,而不是生成一个新的,默认为Flase
s.drop('灭霸',inplace=True, )
print(s)
'''
蜘蛛侠       24
奇异博士      35
钢铁侠       39
蝙蝠侠       40
索尔      1500
Name: 英雄年龄, dtype: int64
'''


小练习:

一下是一些股票代码和股票名称,

  • 300783 三只松鼠
  • 601236 红塔证券
  • 603256 宏和科技
  • 601698 中国卫通
  • 603867 新化股份
  • 600968 海油发展
  • 300594 朗进科技
  • 603863 松炀资源
  • 603217 元利科技
  1. 将这列数据创建成一个 Series,股票名称作为索引,股票代码是数据.
  2. 使用显式索引提取出红塔证券的代码
  3. 使用隐式索引提取新化股份的股票代码
  4. 使用显式索引提取从三只松鼠到中国卫通的股票代码
  5. 使用显式索引提取元利科技,松炀资源,朗进科技的股票代码
  6. 使用隐式索引提取红塔证券中国卫通和海油发展的代码
  7. 使用显式索引和隐式索引分别提取三只松鼠,宏和科技,海油发展的股票代码
  8. 在序列中添加一个新的数据,东方金钰 股票代码为 600086
  9. 在序列中将中国卫通股票代码修改为 666666
  10. 删除掉三只松鼠
  11. 将最后三只股票代码改成 100000
  12. 一次性将中国卫通,宏和科技,海油发展的数据改为 966666
data = [300783,601236,603256,601698 ,603867,600968,300594,603863,603217]
index = ["三只松鼠",'红塔证券','宏和科技','中国卫通','新化股份','海油发展','朗进科技','松炀资源','元利科技']
import pandas as pd
stock = pd.Series(data, index)
print(stock['红塔证券'])
print(stock[0])
print(stock['三只松鼠','中国卫通'])
print('元利科技':'朗进科技':-1)
print(s[1:6:2])
print(s[['三只松鼠','宏和科技','海油发展']])
print(s[[0,2,5]])
stock['东方金玉'] = 60086
stock['中国卫通'] = 666666
stock.drop('三只松鼠',inplace=True)
stock[-3:] = 100000
stock[['中国卫通','宏和科技','海油发展']] = 966666

广播的方法进行计算

  因为Series底层封装的也ndarray数组结构, 因此同样支持向量化操作, 可以利用广播的方法进行计算.

import numpy as np
import pandas as pd
data = np.array([22, 3000, 33, 37, 40, 1500])
s = pd.Series(data ,name='英雄年龄' , index= ['蜘蛛侠', '灭霸', '奇异博士', '钢铁侠', '蝙蝠侠', '索尔'])
s.index.name = "英雄姓名"
print(s)
'''
英雄姓名
蜘蛛侠       22
灭霸      3000
奇异博士      33
钢铁侠       37
蝙蝠侠       40
索尔      1500
Name: 英雄年龄, dtype: int32
'''
print(s)
'''
英雄姓名
蜘蛛侠       24
灭霸      3002
奇异博士      35
钢铁侠       39
蝙蝠侠       42
索尔      1502
Name: 英雄年龄, dtype: int32
'''
print(s ** 2)


 # 封装了很多统计的方法
 s.mean() # 求平均值
 s.max() # 求最大值
 s.min() # 求最小值
# 等等一系列的计算方法

DataFrame

  DataFrame 是一个带有索引的二维数据结构,每列可以有自己的名字,并且可以有不同的数据类型。你可以把它想象成一个 excel 表格或者数据库中的一张表,DataFrame 是最常用的 Pandas 对象。
在这里插入图片描述

DataFrame的创建

  在构建 DataFrame 的时候,主要有两种思路

  1. 数据为字典类的格式, 是以列的方式进行组织, 字典的 key 将会作为列名,字典的值value作为列的数据.
data = {
    "年龄":[19, 3000, 30, 37, 40, 1500], 
    "城市":["纽约皇后区", "泰坦星球","费城", "纽约", "哥谭",  "阿斯加德" ],
    "装备":['蜘蛛战服','无限手套','披风','动力装甲','蝙蝠战衣','雷神之锤']
}  # 冒号前为键。
index = ['蜘蛛侠', '灭霸', '奇异博士', '钢铁侠', '蝙蝠侠', '索尔']
df = pd.DataFrame(data,index = index)
print(df)
'''
	年龄	城市	装备
蜘蛛侠	19	纽约皇后区	蜘蛛战服
灭霸	3000	泰坦星球	无限手套
奇异博士	30	费城	披风
钢铁侠	37	纽约	动力装甲
蝙蝠侠	40	哥谭	蝙蝠战衣
索尔	1500	阿斯加德	雷神之锤
'''
  1. 数据为列表类形式, 是以行的方式进行组织的, 列名需要用参数传入进去.
data = [
    [19, "纽约皇后区",'蜘蛛战服'], 
    [3000, "泰坦星球",'无限手套'], 
    [30, "费城",'披风'], 
    [37, "纽约",'动力装甲'], 
    [40, "哥谭",'蝙蝠战衣'], 
    [1500, "阿斯加德",'雷神之锤']
]
index = ['蜘蛛侠', '灭霸', '奇异博士', '钢铁侠', '蝙蝠侠', '索尔']
df = pd.DataFrame(data, columns=['年龄', '城市','装备'], index=index)

   从本地磁盘中进行读取

eastmoney = pd.read_csv('eastmoney.csv') # 将文件放置在同一个路径下

DataFrame 的索引和切片

提取列数据

  提取数据表中的列, 是最常用的操作之一, 因此这个操作也非常简单.

  只要把列名作为索引的 key 就可以了

 print(df)
 #  三个元素: 年龄,城市,装备

在这里插入图片描述

# 通过列名提取里面的Series
df['装备']
'''
蜘蛛侠     蜘蛛战服
灭霸      无限手套
奇异博士      披风
钢铁侠     动力装甲
蝙蝠侠     蝙蝠战衣
索尔      雷神之锤
Name: 装备, dtype: object
'''
# 也可以提取多个Series
print(df[['年龄','城市']])
# 同样可以实现重复提取
 # print(df[['年龄','年龄','城市']])

在这里插入图片描述

# 将列名当做一个实例属性看待
print(df.装备) # 其实最后显示出的结果 与 print(df['装备'])
# 但是这种方法只能提取一列,不能一次提取多列,但是df[]可以一次提取多列

索引和切片

  对应字典和列表的两种方式,也是分为两种思路, 分别是显式索引隐式索引

  • 显式索引

  在显示索引中,把 DataFrame 的索引值当做第一个轴的 key,把列名当做第二个轴的 key,语法就是.loc[索引行,索引列 ]

# 依旧以df为例
# 例如我现在想要奇异博士的城市,则需要通过行索引"奇异博士" 和列索引"博士" 去进行定位

print(df.loc['奇异博士','城市'])
'''
费城
'''
# 也可以进行切片,例如我想要获取从奇异博士到蝙蝠侠的装备数据

print(df.loc['奇异博士':'蝙蝠侠', '装备'])
'''
奇异博士      披风
钢铁侠     动力装甲
蝙蝠侠     蝙蝠战衣
Name: 装备, dtype: object
'''
# 提取的是二维的, 返回的就是DataFrame
print(df.loc['钢铁侠':'蝙蝠侠','城市':'装备'])

在这里插入图片描述

# 也可以设置步长,灭霸到蝙蝠侠的年龄
print(df.loc['灭霸':'蝙蝠侠':2,'年龄'])
'''
灭霸     3000
钢铁侠      37
Name: 年龄, dtype: int64
'''

省略某个维度的索引值

  当后面的维度不需要索引,全都想要时

print(df.loc['灭霸':'钢铁侠'])
'''
        年龄    城市    装备
灭霸    3000  泰坦星球  无限手套
奇异博士    30    费城    披风
钢铁侠     37    纽约  动力装甲
'''
print(df.loc[: , '装备']) # 所有行
'''
蜘蛛侠     蜘蛛战服
灭霸      无限手套
奇异博士      披风
钢铁侠     动力装甲
蝙蝠侠     蝙蝠战衣
索尔      雷神之锤
Name: 装备, dtype: object
'''

# 同样我们可以设置步长
print(df.loc[:,'年龄':'装备':2])
'''
        年龄    装备
蜘蛛侠     19  蜘蛛战服
灭霸    3000  无限手套
奇异博士    30    披风
钢铁侠     37  动力装甲
蝙蝠侠     40  蝙蝠战衣
索尔    1500  雷神之锤
'''
  • 隐式索引

  使用 iloc 也就是 index_loc

  这种方式不看你的行索引和列索引是什么名称,可以把数据当做是一个有序列表, 只看数据是处于表中的一个什么位置。

# 以df为例

# 奇异博士的城市
print(df.iloc[2, 1])
'''
费城
'''
print(df.iloc[2:4 , 1:])

在这里插入图片描述

print(df.iloc[0]) # 第0行全部数据
'''
年龄       19
城市    纽约皇后区
装备     蜘蛛战服
Name: 蜘蛛侠, dtype: object
'''
print(df.iloc[[0,1,5],[1,2]])

在这里插入图片描述

序列值索引

  我们注意到, 上面的那种索引方式其实有一定的局限性, 如果想要索引的值并没有规律的 步长, 恐怕就做不到了!例如我想要蜘蛛侠, 灭霸和蝙蝠侠这三个人的城市信息, 用刚才的方法, 能够做到吗?

# 这时候,我们可以直接使用想要的索引值构成一个序列, 用这个序列作为索引填入进去
# 以df为例
print(df.loc[ ['灭霸','奇异博士','索尔'] ,'年龄' ])   # 显式索引
'''
灭霸      3000
奇异博士      30
索尔      1500
Name: 年龄, dtype: int64
'''

# 两个坐标轴都可以这样做,而且不用考虑原数据的顺序
print(df.loc[ ['灭霸','奇异博士','索尔'] ,['装备','城市','装备'] ])
'''
      装备    城市    装备
灭霸    无限手套  泰坦星球  无限手套
奇异博士    披风    费城    披风
索尔    雷神之锤  阿斯加德  雷神之锤
'''

小练习

  1. 读取 student_grade 数据集,储存在变量 grade 中
grade = pd.read_csv('student_grade.txt',sep='\t')  # 设置分隔符\t

  1. 使用两种方法提取姓名列
grade['姓名']
grade.姓名
  1. 提取语文数学英语三列数据
grade['语文','数学','英语']
  1. 提取从第 10 名到 20 名同学的数据
grade.iloc[9:19]
  1. 提取前十个同学的姓名和总分
grade.iloc[:9,['姓名','总分']]
  1. 提取所有偶数学员的成绩
grade.iloc[::2]
  1. 提取班名次为 第28, 38 ,42 三个同学的总分
grade.loc[[27,37,42 ],['总分']]
  1. 提取行索引为12, 18 ,20 三个同学的 班名次和姓名
grade.loc[[12,18,20],['班名次','姓名']]

新增/删除列

  在生成了 DataFrame 之后,突然你发现好像缺失了用户的性别这个信息,如何添加呢?
如果所有的性别都一样,我们可以通过传入一个标量,Pandas 会自动帮我们广播来填充所有的位置。

新增一行数据

# 以df为例


# 新增行需要用loc 不能用iloc
df.loc['黑寡妇'] = [43,'前苏联','手枪']

在这里插入图片描述

新增一列数据

df['性别'] = '男' # 新列全部为男性
df['性别'] = ['男','男','男','男','男','男','女'] # 按行分别指定新增列的数据

删除数据

  与Series一样,分.pop.drop,且用途一样

df.pop('性别') # 弹出一列数据 
# 弹出后的df 则是删除了“性别”列的数据


# .drop两个指令index和columns
# index=None 删除行
# columns=None 删除列
df.drop(index = '钢铁侠')
df.drop(index = ['钢铁侠','灭霸','蝙蝠侠'])
df.drop(columns='年龄' )

查看信息

  如果我们的数据量非常大,我想看看数据长啥样,我当然不希望查看所有的数据了,这时候我们可以采用只看头部的 n 条或者尾部的 n 条。

  查看头部的n 条数据可以使用 head 方法,查看尾部的 n 条数据可以使用 tail 方法。

# 以grade为例
grade.head() # 默认前5条数据
grade.head(6) # 指定查看前6条数据
grade.tail()# 默认末尾5条数据
grade.tail(6) # 指定查看末尾6条数据

  除此之外,我们还可以 .shape 获取数据的形状(几行几列),通过 .T 获取数据的转置。

# 查看数据基本信息 info
grade.info

掩码提取数据

  对grade数据进行提取,其实就是数据的过滤

import pandas as pd
data = {
    "年龄":[19, 3000, 30, 37, 40, 1500], 
    "城市":["纽约皇后区", "泰坦星球","费城", "纽约", "哥谭",  "阿斯加德" ],
    "装备":['蜘蛛战服','无限手套','披风','动力装甲','蝙蝠战衣','雷神之锤']
}  # 冒号前为键。
index = ['蜘蛛侠', '灭霸', '奇异博士', '钢铁侠', '蝙蝠侠', '索尔']
df = pd.DataFrame(data,index = index)
df.loc['黑寡妇'] = [43,'前苏联','手枪']

在这里插入图片描述

# 首先我们来举一个例子
# 布尔序列提取数据
T = [True, False, False, True,True,True,False]
df[T]
# 我们发现的是,输出的结果,均是Ture的数据。

在这里插入图片描述

print(df.年龄 > 50)
'''
蜘蛛侠     False
灭霸       True
奇异博士    False
钢铁侠     False
蝙蝠侠     False
索尔       True
黑寡妇     False
Name: 年龄, dtype: bool
'''
# 我们得到了关于年龄的 Ture和False的值
df[df.年龄 > 50] 
# 输出的值都是Ture的值

在这里插入图片描述

df[df.装备 == '雷神之锤']
'''
 年龄    城市    装备
索尔  1500  阿斯加德  雷神之锤
'''
#对grade数据进行提取

# 提取班级名次为 30名的同学的成绩
grade[grade.班名次 == 30]

# 提取班级名次为5的倍数的同学的成绩
grade[ grade.班名次 % 5 == 0  ]

# 提取总分大于 300 小于 400的同学的成绩
grade[ (grade.总分 > 300) &  (grade.总分 < 400) ] # 需要注意的是300< grade.总分<400这种语法是错误的,我们只有 & 与  | 或 ~ 非

# 提取刘姗同学的成绩
grade[grade.姓名 == '刘姗']

# 提取 王雪 ,李季 同学的 姓名和总分成绩
grade[(grade.姓名 == '王雪')  | (grade.姓名 == '李季') ][['姓名','总分']]
# 我们学习的loc和iloc也能支持
grade.loc[ (grade.姓名 == '王雪')  | (grade.姓名 == '李季')   ,['姓名','总分'] ]


# 提取 任何一科为90分的同学的成绩
grade[(grade.数学 == 90) | (grade.语文 == 90) | (grade.英语 == 90) ]

# 数学不及格同学的成绩
grade[ ~(grade.数学 >= 90)]

数据的读取与保存

读取

  .read_csv所有的文本模式,都可以用这个读取 csv, txt …只要你能用记事本打开的。

  • filepath_or_buffer: 文件,
  • sep=’,’, 数据分隔符
  • delimiter=None, 同上
  • header=‘infer’, 表头/列名 ,默认,用数据的第一行作为列名. None就是不用据列名
  • names=None, 列名
  • index_col=None, 用哪一列作为行索引
pd.read_csv('student_grade.txt',sep='\t',index_col='班名次') 

  打开excel文件,使用.read_exce

 我们需要知道的是,一个excel文件中就可以包含多个表。且第一个表的索引为0,第二个表索引为1…所以.read_exce方法可以指定读取第几个表,

# sheet_name=0,表名, 默认是第一张表
pd.read_excel('test.xlsx')
pd.read_excel('test.xlsx',sheet_name=1)
# 我们也可以指定sheet_name的名字来读取
pd.read_excel('test.xlsx',sheet_name='第二张')

写入

# to 写入
grade.to_csv('文件名.csv')
# 将grade的内容,写入文件名为 '文件名.csv'的文件中去,如果没有,则在当前目录下创建文件。
 # 不保存第一行数据
grade.to_csv('成绩单.txt',header=None)
# 不保存索引
grade.to_csv('成绩单2.txt',header=None, index=False)


# 保存成excel
# 保存到成绩单3.xlsx,并且表名叫做三年二班成绩单
grade.to_excel('成绩单3.xlsx',sheet_name='三年二班成绩单')

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值