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)