Python学习笔记(六)
Pandas库
Series数据结构
pandas库的基本数据结构为Series: 一个带标签(又称索引)的一维数组
Series 的标签类似于Hbase中的行键,可重复且可以自由转换为列值。
Series 的一维数组类似于Hbase中的列值
Series的一般属性见下表:
属性 | 说明 |
---|---|
dtype,dtypes | 数组元素的数据类型 |
shape | 数组的维度 |
ndim | 数组轴(维度)的个数,轴的个数被称作秩 |
size | 数组元素的总个数 |
itemsize | 数组中每个元素的字节大小 |
nbytes | 数组总字节数 |
flags | 对象的内存信息 |
base | 数组对象在内存中基于其他对象的信息 |
axes | 行标签列表 |
data | 内存中的数据信息 |
values | 以ndarray的形式返回Series中的数据 |
关于手动创建一个Series数据结构
import numpy as np
import pandas as pd
s=pd.Series() #空的
s=pd.Series(np.array([1,2,3])) #使用np数组构造
s=pd.Series({'a':1,'b':2,'c':3}) #使用字典(行键:值)构造
s=pd.Series([1,2,3]],index=['1','2','3']) #创建时指定标签(索引)名
关于通过索引和标签访问数据
- 1、通过索引或标签值获得
- 2、通过索引或标签的list获取多个行键(list的值可以用罗列和范围)
s = pd.Series([1,2,3,4,5],index = ['a','b','c','d','e'])
s[0] #下标为0的行
s[[0,1]] #下标为0和1的行
s[[-3:]] #python列表的切片语法
s['b'] #标签为b的行
s[['b','c']] #标签为b 和 c的行
s[['b':]] #标签'b'之后的行
关于Series的切片方法
1、直接使用访问方法切片 : []
2、索引切片方法:iloc
3、标签切片方法:loc
4、head取前n行
#iloc
s.iloc[1:2]
#loc
s.loc['a':'c']
#head
s.head(2)
关于Series的常用方法
方法 | 说明 |
---|---|
sort_values() | 按照Series的值进行排序,默认是升序,设置降序:sort(ascending=False) |
value_counts() | 用来计算Series里面相同数据出现的频率,生成新的Series |
max() /min() | 返回Series中的最大值和最小值 |
mean() | 求均值 |
median() | 求中位数 |
std() | 求标准差 |
isnull() | 判断是否为空值 |
unique() | 返回数组中的唯一值 |
============================================================================
DataFrame数据结构
============================================================================
就是一个二维数组,axis0为列,axis1为行
列标签:在Series数据结构基础上增加了列标签,另外行标签有序
列值:可以为不同的数据类型dtype
关于创建DataFrame
#同时设定行列键:pd.DataFrame(dict{col:dict{row1:value1,row2:value2}})
x=pd.Series({'row1':1,'row2':2}) #col1即为列标签
df=pd.DataFrame({'col1':{'row1':1,'row2':2}})
#筛选固定列键
x = {'a': [1], 'b': [2], 'c': [5]}
pd.DataFrame(x,columns=['a']) #未指定行键,筛选列键为'a'的导入
关于加载数据到DataFrame
支持的数据源:CSV格式、EXCEL格式、HTML格式、JSON格式、SQL数据库
dataframe = pd.read_csv(url)
dataframe = pd.read_excel(url)
dataframe = pd.read_html(url)
dataframe = pd.read_json(url)
dataframe = pd.read_sql(url)
#指定格式:索引列(充当行键的列) 、时间、列键:数据类型
df=pd.read_csv(url,
index_col=['city'], # use 'city' as index
parse_dates=['sale_date'], # parse 'sale_date' as date
dtype = {'zip': 'str'})
关于DataFrame的列操作
DataFrame 以列键为axis0一维,行键为axis1二维
#取指定列的行键和行值
df=pd.DataFrame([{'a': 1, 'b': 2}, {'a': 3, 'b': 4, 'c': 5}])
df['a']
df[['a','c']]
#添加列
df['d']=[1,2] #长度必须匹配
df['e']=pd.Series([1,2,3]) #长度不需匹配,自动截断或补NaN
df['f']=pd.Series([1,2,3],index=[0,'0','a']) #只取index与行键匹配的值
#删除列
del df['a']
def df['a'],df['b'] #多列删除不方便,使用drop方便
df.pop('c') #返回该列的Series
df.drop(column=['b','c'],inplace=True) # 参数inplace:是否替换原DF
df['a'][1] #二位数组取值
关于DataFrame的行列键转换
#删除当前行键列,使用指定列作为行键
df.set_index('colName')
#当前行键列(标签/索引)转为列键,添加新的数字索引
df.reset_index()
关于DataFrame的行操作
关于DataFrame的切片
基本与Series的切片语法相同,需要注意的是DF是二维数组且列键不支持范围切片
1、指定列切片
2、iloc 所有列索引切片
3、loc 所有列标签切片
#df是二位数组,且axis0列键不支持范围切片
df['a'][0:] #获取a列的所有值
df[['a','b']][0:]
#行切片
df.iloc[0:]
df.loc[0:1]
#行列切片
df.loc[0:1,'a':'c']
df.iloc[0:1,0:2]
关于DataFrame的行的bool切片
关于DataFrame的行的选择查找
列键切片支持bool的逻辑运算符,类似于Scala的filter
#等
df[df['type'] == 'Condo']
#且
df[(df.type != 'Condo') & (df.baths <= 3)]
#或
df[(df.type == 'Condo') | (df.beds >= 3)]
#非
df[~(df.type == 'Condo')]
关于添加行
df=pd.DataFrame([{'a':1,'b':2,'c':3,'d':4},{'a':2,'b':4,'c':6,'d':8}])
df.loc["newrow"]=['a','b','c','d'] #行值的长度必须匹配
df.loc[len(df)]=pd.Series([8,9],index=[0,100]) #index匹配的才会追加
df.loc[len(df)] = ??? #尾部追加
df.append([{'a':3,'b':4,'c':5,'d':6}])
df.append(pd.Series([6,7,8,9],index=['a','b','c','d'],name='n'))
关于选取子DataFrame
df.loc["row1":"row100","col1":"col50"]
df.iloc[row_index1:row_index2,col_index1:col_index2]
df.loc["row1":"row2"]
df.iloc[row_index1:row_index2]
关于遍历DataFram的列与行
#遍历列键名
for col in df:
print(col)
#遍历数据
for index,row in df.iterrows():
print(index,row,sep='\n')
关于DataFram的Group分组操作
- 分组并不会发生归约,而是将同一分组的归并为一个DataFrame对象存储,同时多个分组的DataFrame组成了整体的DataFrame
df=pd.read_csv("C:/Users/HuYang/Desktop/Sacramentorealestatetransactions.csv")
byCity = df.groupby('city')
#多重分组
byStateCity = df.groupby(['state', 'city'])
#遍历每个分组,打印分组名(分组键的值)和分组内容,\n 分割两个变量
for name, group in byCity:
print(name, group, sep="\n")
#通过Group名获取DataFrame对象
goldRiver=byCity.get_group("GOLD RIVER")
goldRiver=byStateCity.get_group(('CA', 'GOLD RIVER'))
#通过Group名获取索引标签
byCity.groups['GALT'] #返回该分组对应所有索引标签
byStateCity.groups[('CA', 'GALT')]
#获取分组大小
byCity.size()['GALT']
byStateCity.size()[('CA', 'GALT')]
#取各个分组在每个字段上的最大值
byCity.max()
byCity.min()
byCity.mean() #各个分组在每个字段上的平均值
byCity.sum() #各个分组在每个字段上的和
#取各个分组的索引最值
byCity.idxmax()
byCity.idxmin()
关于DataFrame的聚合
#先分组
byCity.agg(np.mean,np.min)