7月18日课堂到22日pandas学习和借鉴笔记

Pandas基本知识与常用语法

1. Pandas中的数据结构

Series

一维数组,与Numpy中的数组(Array)相似数组中只允许存储相同的数据类型。

DataFrame

二维数据结构,相当与表格。主体分数据和索引两部分。数据以行(Row)和列(Column)的表格方式排列,

2. series结构基本操作

2.1 创建series

函数形参表:

Series(data=None, index=None, dtype=None, name=None, copy=False, fastpath=False)

1

data:存放数据的集合对象,可以是迭代对象、字典(版本>3.6)、常量(重复多次)

Index:指定索引或者自动生成的正整数索引值

dtype:指定数据类型

name:指定索引名称,

copy:是否对data进行复制,默认视图方式

Fastpath:这个参数在官方api文档中并没有给出具体解释,从源码来看应当是一种快速精简模式

省略所有参数生成空series

(1)由数组或列表建立

s1 = pd.Series(np.array([1,2,3,4]))

(2)指定索引并默认创建

 

s2 = pd.Series(np.arange(3), index=['a', 'b', 'c'])

# Series对象的默认值分别为0,1,2。其索引分别为a,b,c

(3)通过字典创建,同时指定名称和数据类型

s3 = pd.Series({'Tom': 95, 'Jack': 68, 'Alice': 83}, dtype=float, name='score')

1

索引 Value

Tom 95.0

Jack 68.0

Alice 83.0

由于DataFrame的操作比Series的使用更广泛,这里我们省略Series常用操作,重点介绍DataFrame的操作

3. DataFrame基本语法

3.1 创建DataFrame

DataFrame形参表

DataFrame(data=None, index=None, columns=None, dtype=None, copy =False)

 

(1)通过现有的字典方式建立

data = {'Tom': [100, 88, 99], 'John': [89, 97, 100], 'Alice': [88, 99, 100]}

df1 = pd.DataFrame(data) 

(2)通过带Series对象的字典建立

s1 = pd.Series(np.array(['Tom', 'John', 'Alice', 'Jack']))

s2 = pd.Series(np.array([101, 606, 411, 310]))

temp_dic = {'Name': s1, 'Room No': s2}    

df3=pd.DataFrame(temp_dic)

Name为第一个行索引,s1为第一列的数据;Room No为第二个行索引,s1为第二列的数据

(3)通过现有的数组方式建立

data2 = np.array([[18, 19, 20], [2, 3, 4], [21, 22, 23]])

df2 = pd.DataFrame(data2)  

# 此时行索引与列索引均为默认值0,1,2

(4)显示设置行列标签,在(3)的基础上加了对行索引与列索引的赋值

score_arr = np.array([[95, 100, 99], [90, 80, 100], [85, 100, 100]])

score_df = pd.DataFrame(score_arr,columns=['语文', '数学', '英语'],index=['Tom', 'John', 'Alice'])

 

3.2 DataFrame常用属性

print(score_df.shape) # 获取DataFrame的形状大小

print(score_df.size) # 获取元素个数

score_df.info() # 获取DataFrame对象的基本信息

print(score_df.columns) # 获取列索引

print(score_df.index.tolist()) # 获取行索引

3.3 获取DataFrame中的数据

先创建一个DataFrame,用列表list构建数组array,再将数组转为DataFrame

employee_info_ls = [['001', '李明', 23, '吉林', 20000.00],

      ['002', '韩雷', 26, '湖北', 25000.00],

      ['003', '肖红', 30, '江西', 30000.00],

      ['004', '马克', 28, '上海', 21000.00]]

df = pd.DataFrame(np.array(employee_info_ls),

                  index=['one', 'two', 'three', 'four'],

                  columns=['ID', 'Name', 'Age', 'Address', 'Salary'])

(1)通过列索引获取数据

print(df['Name']) # 获取列索引对应的一个Series对象

print(df[['Name', 'Salary']]) # 多列索引返回DataFrame对象

(2)通过行序号切片获取多行

 

print(df[1:4:2]) # 仅可通过行序号切片获取多行

(3)通过行序号切片获取多行

print(df[1:4:2]) # 仅可通过行序号切片获取多行

1

(4)利用values属性获取

print(df.values)

print(df.values[0::2, 1::3])

# 得到的是列表

# [['李明' '20000.0']

# ['肖红' '30000.0']]

(5)利用iloc属性获取

print(df.iloc[1]) # 获取单行,返回Series

print(df.iloc[[0, 1, 3]]) # 整数列表获取多行,返回DataFrame

print(df.iloc[1:4]) # 切片获取多行,返回DataFrame

print(df.iloc[:, 1]) # 获取单列,返回Series

print(df.iloc[:, [1, 3, 4]]) # 整数列表获取多列,返回DataFrame

print(df.iloc[:, 1:]) # 切片获取多列,返回DataFrame

print(df.iloc[0:3, 1:4]) # 行列序号切片,返回DataFrame

print(df.iloc[3, 4]) # 行列序号,返回具体值:

 

1. df.iloc 支持布尔数组筛选

print(df.iloc[[True, False, True, False], [True]*3+[False]*2])

# 选取第一、第三行;选取前三列,舍去后两列

 

2. df.iloc 支持函数

print(df.iloc[lambda x:x.index != 'three'])

# 选取索引x.index不等于three的数据

# Index:行索引,Columns:列索引

1

2

3

(6) 利用loc属性获取,用的最为广泛

print(df.loc['two']) # 获取单行,返回Series

print(df.loc[['one', 'two', 'four']]) # 列表获取多行,返回DataFrame

print(df.loc['two':'four']) # 切片获取多行,返回DataFrame,含终值

print(df.loc[:, 'Name']) # 获取单列,返回Series

print(df.loc[:, ['Name', 'Address', 'Salary']]) # 列表获取多列,返回DataFrame

print(df.loc[:, 'Name':]) # 切片获取多列,返回DataFrame

print(df.loc['one':'three', 'Name':'Address']) # 行列切片,返回DataFrame

print(df.loc['two', 'Salary']) # 行列标签,返回具体值

# 支持布尔数组筛选

print(df.loc[[True, False, True, False], [True]*3+[False]*2])

print(df.loc[df['Address'] == '湖北', 'Name':'Age'])

print(df.loc[df['Name'].str.startswith('肖')])

print(df.loc[df['Name'].isin(['李明', '马克'])])

# 数据筛选,重点掌握

print(df.loc[(df['Age'].astype(int) < 30) & (df['Salary'].astype(float) > 20000)])

print(df.loc[df['ID'].apply(lambda x:int(x[-1])%2 == 0)])

# 当然,除了以上的方法做筛选以外,还可以使用DataFrame.where()方法,这个在后面的修改DataFrame中的数据(7)利用head()和tail()方法

print(df.head()) # 读前10行,不足10行读所有

print(df.tail(2)) # 读后两行

4 修改DataFrame中的数据

(1)基础,通过索引定位修改

df.loc['two', 'Salary'] = 30000.00 # 定位到单个元素,修改该元素的值

df.loc['four'] = np.nan # 修改整行为相同的值

df.loc['four'] = ['004', '韩雷雷', 40, '广州', 28000.00] # 列表修改整行

df.loc[:, 'Address'] = '湖北' # 修改整列为相同的值

df['Age'] = [25, 28, 21, 24] # 列表修改整列

# 修改数据块

df.loc[df['Age'] >= 25, ['Address','Salary']] = [['北京', 35000.0], ['上海', 35000.0]

 

如果行索引和列索引不存在,则会在末尾增加新行!"""DataFrame增加行列"""

new_employee_info_ls = [['005', '刘春娇', 23, '广州', 35000.00],

      ['006', '李志明', 27, '广州', 35000.00]]

df.loc['five'] = new_employee_info_ls[0] # 行索引不存在,则末尾增加新行

df.loc['six'] = new_employee_info_ls[1]

df['Years'] = df['Age'].astype(int)-20 # 列索引不存在,则末尾增加新列

# insert在指定索引处插入列,索引必须为整数,且0<=索引<=len(columns)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值