目录
2.pandas两个常用的工具数据结构——Series和DataFrame
2.2.2 DataFrame中的一列,可以按字典型标记或属性那样检索为Series;
2.2.5 返回DataFrame的values属性(以二维ndarray的形式返回)
pandas——进行数据清洗和分析(适合处理表格或异质型数据)
numpy——数值计算工具(适合处理同质型的数值类数组数据)
matplotlib——数据可视化工具
1.导入pandas
import pandas as pd
2.pandas两个常用的工具数据结构——Series和DataFrame
2.1. Series
Series:一种一维的数组型对象,它包含了一个值序列,并包含了数据标签,称为索引(index)。
不为数据指定索引默认生成的索引是从0-N-1(N是数据的长度)
另一个角度将series考虑成长度固定且有序的字典。所以可以用已存在的字典生成一个series
2.1.1创建series
obj = pd.Series(range(3,10,2))
# 输出:
0 3
1 5
2 7
3 9
dtype: int64
sdata = {'Alice':80,'Bob':88,'Sherry':93}
# 根据已有字典生成一个series
new_sdata = pd.Series(sdata)
# 输出: Alice 80 Bob 88 Sherry 93 dtype: int64
2.1.2 取series的值values和索引index
obj.values
/* 输出:
array([3, 5, 7, 9], dtype=int64)
*/
obj.index
/* 输出:
RangeIndex(start=0, stop=4, step=1)
*/
2.1.3 生成series用修改index将新的series以修改后的index顺序排序
names = ['Bob','Sherry','Alice']
new_sdata_names = pd.Series(sdata,index=names)
# 输出:
Bob 88 Sherry 93 Alice 80 dtype: int64
表示缺失数据:“缺失”或“NA”
(pandas中)检查缺失数据:isnull和notnull函数
new_names = ['Bob','Sherry','Alice','Nobody']
new_sdata_names2 = pd.Series(sdata,index=new_names)
# 输出
Bob 88.0 Sherry 93.0 Alice 80.0 Nobody NaN dtype: float64
pd.isnull(new_sdata_names2) # 检查是空的为True
# 输出
Bob False Sherry False Alice False Nobody True dtype: bool
pd.notnull(new_sdata_names2) # 检查不是空的为True
# 输出
Bob True Sherry True Alice True Nobody False dtype: bool
2.2. DataFrame
dataframe表示的是矩阵的数据表,包含已排序的列集合,每一列可以是不同的值类型。可被视为一个共享相同索引的series的字典。
2.2.1 构建dataframe
最常用的方式:利用包含等长度列表或numpy数组的字典来形成dataframe
产生的dataframe会自动为series分配索引,并且列会按照排序的顺序排列。
import pandas as pd
data = {'state':['Ohio','Ohio','Ohio','Nevada','Nevada','Nevada'],
'year':[2000,2001,2002,2001,2002,2003],
'pop':[1.5,1.7,3.6,24,2.9,3.2],
}
frame = pd.DataFrame(data)
# 输出
frame.head() # 只选出头部的五行
frame2 = pd.DataFrame(data,columns=['year','pop','state']) # DataFrame的列按照指定顺序排列
构建dataframe的第二种方式:包含字典的嵌套字典(将字典的键作为列,将内部字典的键作为行索引。)
pop = {'Nevada':{2001:2.4,2002:2.9},
'Ohio':{2000:1.5,2001:1.7,2002:3.6}
}
frame4 = pd.DataFrame(pop)
构建dataframe的第三种方式:包含series的字典
pdata = {'Ohio':frame4['Ohio'][:-1],
'Nevada':frame4['Nevada'][:2]
}
frame5 = pd.DataFrame(pdata)
2.2.2 DataFrame中的一列,可以按字典型标记或属性那样检索为Series;
frame3 = pd.DataFrame(data,columns=['year','pop','state','222haha'])
frame3.222haha
只在列名是有效的python变量名时有效
frame3['222haha']
对于任意列名均有效
2.2.3 将列表或数组赋值给一个列
值的长度必须和DataFrame的长度相匹配。
如果将series赋值给一列时,series的索引将会按照dataframe的索引重新排列,并在空缺的地方填充缺失值。
c = pd.Series([1,5,8],index=[0,5,3])
frame3['222haha']=c
如果被赋值的列并不存在,则会生成一个新的列
frame3['new_colum'] = frame3['state'] == 'Ohio'
2.2.4 删除一个列
del frame3['new_colum']
注意:从DataFrame中选取的列是数据的视图,而不是拷贝。因此,对Series的修改会映射到DataFrame中。如果需要复制,则应当显式地使用Series的copy方法。
很多函数,如drop,会修改Series或者DataFrame的尺寸或者形状,这些方法直接操作原对象而不返回新对象。
data = pd.DataFrame(np.arange(16).reshape(4,4),
index = ['Ohio','Colorado','Utah','New York'],
columns = ['one','two','three','four']
)
data.drop('Ohio')
但是,此时
要清除被删除的数据,需要加入inplace属性
只能执行一次,不然会报错,因为删掉后已经没这行(列)了。
2.2.5 返回DataFrame的values属性(以二维ndarray的形式返回)
frame4.values
如果DataFrame的列是不同的dtypes,则values的dtype会自动选择适合所有列的类型
2.2.6 索引对象
索引对象是不可变的,用户是无法修改索引对象的。
重建索引——用reindex创建一个符合新索引的新对象。
obj = pd.Series([4,5,6])
new_obj = obj.reindex(['a','b','c'])
new_obj = obj.reindex([2,'b',0])
注意:
1.调用reindex方法时,会将数据按照新的索引进行排列,如果某个索引值之前并不存在,则会引入缺失值。所以不是简单的按顺序把原series的index重新改变了。
2.索引对象是不可变的,用户是无法修改索引对象的,调用reindex方法也并没有修改原DataFrame,调用reindex方法后如果不返回赋值一个新的变量,那么在此基础上做些操作可能会出错。
ab = ['a','b','d']
f=frame.reindex(columns=ab)
f.loc[[1,2],ab]
2.2.7 Series或者DataFrame的索引
# 根据 index
# 根据 序号
普通的python切片是不包含尾部的,Series的切片与之不同
使用这些方法可设值修改Series的相应部分
# 单取一列
# 取用列表排序想要的index
# 用index序号来索引
# 用布尔值数组切片或选择数据
# 选择数据将其赋值
2.2.8 使用loc和iloc选择数据
使用轴标签(loc)或整数标签(iloc)以Numpy风格的语法从DataFrame中选出数组的行和列的子集。
除了单个标签或者标签列表外,索引功能也可以用于切片
ix索引依然存在,但不推荐,推荐使用严格的基于标签的索引的loc和基于整数的索引的iloc。
注意:DataFrame的切片或者说索引(某数,不是某列)一定要用df.loc[]或df.iloc[],没有df[]这种写法(df[列名]可以取某列),series有s[]的写法取某数.
2.2.9 使用填充值的算数方法
为什么要酱紫?
想要实现类似于索引标签的自动外连接,没有交叠的标签位置上,内部数据对齐会产生缺失值。
可以看到哪怕df2的e列有数据,但是在df1+df2合并后形成的表是没有值的。
也就是将这些df添加到一起会导致在一些不重叠的位置出现NA值。
即是说在进行四则运算的时候由于DataFrame之间可能存在行列索引不能对齐的情况,这样计算得到的结果会出现空值,所以我们需要对空值进行处理。
我们可以在进行计算的时候通过传入fill_value进行填充,另外直接使用运算符进行运算是没办法传递参数进行填充的饿,所以我们需要使用DateFrame中为我们提供的算数方法,add/sub/div等。
若在算除法的过程当中发生了除零,得到了一个inf,它表示无穷大。
radd/rsub前面加个r是用来翻转参数的。
若我们希望得到DataFrame中所有元素的倒数,我们可以写成1/df,但1本身并不是一个DataFrame,所以我们不能用1来呼叫DataFrame中的方法,也就不能传递参数,为了解决这种情况,我们可以把1/df写成df.rdiv(1)
2.2.10 DataFrame和Series间的操作
广播机制:当我们从arr中减去arr[0]时,减法在每一行都进行了操作
DataFrame 和Series间的算术操作和Numpy中不同维度数组间的操作类似。
默认DataFrame和Series的数学操作中会将Series的索引和DataFrame的列进行匹配,并广播到各行。如果一个索引值不在DataFrame的列中,也不在Series的索引中,则对象会重建索引并形成联合。
如果想改成在列上广播,在行上进行匹配,必须使用算术方法中的一种。
2.2.11 函数应用和映射
Numpy的通用函数(逐元素数组方法)对pandas对象也有效。
# 生成数值符合正太分布的4行3列的数组
frame = pd.DataFrame(np.random.randn(4,3),columns=list('bde'),index=['Utah','Ohio','Texas','Oregon'])
DataFrame的apply方法可将函数应用到一行或一列的一维数组上。
注意:默认是从axis=0,也就是列
传递给apply的函数不一定要返回一个标量值,也可以返回带有多个值的Series
def f(x):
return pd.Series([x.min(),x.max()],index = ['min','max'])
frame.apply(f)
逐元素调用函数的时候用applymap方法。
假如想要根据frame中的每个浮点数计算一个格式化字符串,可以使用applymap方法。
如果用apply,则报错
使用applymap作为函数名是因为Series有map方法,可以将一个逐元素的函数应用到Series上。
2.2.12 排序和排名
sort_index()方法:按行或按列索引进行字典型排序,该方法返回一个新的,排序好的对象。
数据默认会升序排序,但是也可以按照降序排序
也可用sort_values()方法根据Series的值进行排序,默认情况下,所有的缺失值会被排序到Series的尾部。
使用多列作为排序键,即传递多个列名给sort_values的可选参数by
Series和DataFrame的rank()方法:实现排名,当有平级情况时,取它们的平均排名
例如4排第4和第5,则它们的平均等级为(4+5)/2=4.5
但这种就有可能出现小数,
当出现同样的数字的时候,我们按先看到谁谁就是老大的原则,也就是排名根据他们在数据中的观察顺序进行分配。rank(method = "first")
ascending=False #降序排列
method="max" #将排名最大的赋值给值
DataFrame可以对行或列计算排名
skipna=True #有缺失值也会计算结果
默认为True
idxmax() 或者idxmin() 返回的是间接统计信息。
除归约方法外,有的方法是积累型方法:
如cumsum()
2.2.13 唯一值,计数和成员属性
一维Series包含的数值可能是重复的,unique()方法会给出Series中的唯一值。
value_counts()方法计算Series包含的值的个数,返回的Series会按照数量降序排列。可设置sort=False不排序返回
isin()方法执行向量化的成员属性检查
还可以将数据集以Series或者DataFrame一列的形式过滤为数据集的值子集。
与isin相关的Index.get_indexer()方法,可以提供一个索引数组,这个索引数组可以将可能非唯一值数组转换为另一个唯一值数组:
当我们想要计算DataFrame多个相关列的直方图,可以将函数传入DataFrame的apply函数可得到。
例如将pandas.value_counts传入可得到所有列中出现的值它们分别在每列中出现的次数。
结果中的行标签是所有列中出现的不同值,数值是这些值在每个列中出现的次数