pandas引入约定:
注:因为Series和DataFrame用的次数多,因此引入本地命名空间中更方便。
pandas的两个主要数据结构:Series和DataFrame
一、Series
Series由一组数据(各种Numpy数据类型)以及一组与之相关的数据标签(索引)组成。
Series有values和index两个属性,表示数组形式和其索引对象。
可以自己设置index:
也可以通过字典来创建Series:
Series对象本身及其索引都有一个name属性:
Series的索引可以通过赋值就地修改:
二、DataFrame
构建DataFrame的方法:
1.传入一个由等长列表或Numpy数组组成的字典:
如果指定了列序列,则DataFrame的列就会按照指定顺序进行排列:
行索引可以通过索引字段ix进行获取:
为不存在的列赋值会创造出一个新列。例如,frame中不存在debt列,,如此赋值会创造出一个新列。
pandas的isnull和notnull函数用于检测缺失数据:
关键字del用于删除列:
通过索引返回的列是相应数据的视图,不是副本,因此对返回的Series做的任何修改都会反映到DataFrame上。
另一种很常见但是也较难理解的产生DataFrame的方式是嵌套字典:
传给DataFrame,会被解释为:外层字典的键作为列,内层键则作为行索引:
DataFrame构造函数所能接受的数据:
可以设置DataFrame的index和columns的name属性:
Series的index是不可修改的,这一点非常重要。
三、重新索引
pandas对象可以通过reindex重新创造一个新索引。
对于时间序列数据,重新索引需要做一些插值处理,需要使用method参数:
对于DataFrame,reindex可以修改行和列索引,或者两个都修改,但如果只传入一个序列,则会重新索引行:
使用columns可以重新索引列:
ix的标签索引:
四、丢弃指定轴上的项
对于Series使用drop方法:
对于DataFrame,使用drop方法可以删除任意轴的索引值,如不加axis=1,则默认删除的是0轴上的索引:
五、索引、选取和过滤
Series的索引类似Numpy数组的索引,但是Series可以使用index来选取切片。
【利用标签的切片和普通的python切片不同,其末端是包含的】
注:新版本的pandas已弃用icol和irow方法,改为iloc方法
注:直接对dataframe使用列索引可以直接获取列,如果使用ix方法再加上索引就必须遵循先行后列。
六、算术运算和数据对齐
注意:自动的数据对齐会在不重叠的索引处引入NA值
可以使用add方法,如:df1+df2变成:
即可避免出现df1+df2的数值只有当索引在两个数据框都存在时才显示。
七、DataFrame和Series之间的运算
默认情况下,DataFrame和Series之间的算术运算会将Series的索引匹配到DataFrame的列,然后沿着行一直向下广播
如果希望匹配的是行且在列上广播,则必须使用算术运算方法,且在axis参数中指定轴:
八、函数应用和映射
1.Numpy的ufuncs(元素级数组方法)也可用于操作pandas对象:
2.apply方法可以将函数应用到由各列或行所形成的一维数组上:
元素级的操作可以用applymap()函数,因为Series的元素级操作可以使用map()用法。
apply()是一种让函数作用于列或者行操作,applymap()是一种让函数作用于DataFrame每一个元素的操作,而map是一种让函数作用于Series每一个元素的操作
九、排序和排名
返回对行索引或列索引进行排序后的结果,可使用sort_index方法。
1.对Series,只有一个索引
2.对于DataFrame,如不指定axis,则默认axis=0
数据是默认升序排序,如果要降序排序则使用参数ascending=False
3.如果要按值对Series进行排序,可以使用order方法,缺失值默认放到末尾。
4.根据某一列的值进行排序,将一个或多个列的名字传递给by选项:
5.Series和DataFrame的rank方法,默认情况是为各组分配一个平均排名来破坏平级关系。
对于DataFrame,可以在行或列上产生排名:
十、汇总和计算描述统计
调用DataFrame的sum方法会返回列小计,传入axis=1会按行进行求和计算。
NA值会被自动排除,除非整个切片都是NA,但是如果禁用了skipna参数,该功能就不起作用了。
注:NAN会被自动忽略,因此对于NAN的累加还是NAN
describe函数可以产生多个汇总统计的指标:
十一、相关系数与协方差
Series的corr方法用于计算两个Series中重叠的、非NA的、按索引对齐的值的相关系数。
对于DataFrame,corr和cov方法返回相关系数和协方差矩阵
DataFrame的corrwith可以计算一个数据框和另一个Series或DataFrame的相关系数:
传入Series的话,就会显示DataFrame的所有行或列和该Series的相关系数;
传入DataFrame的话,则会计算按列名配对的相关系数。
传入axis=1即可按行进行计算。
十二、唯一值、值计数以及成员资格
获取唯一值的函数unique(),如果需要对返回的唯一值进行排序的话,需要使用函数uniques.sort()
value_counts用于计算一个Series中各值出现的频率
isin用于判断矢量化集合的成员资格,可用于选取Series或DataFrame列中的子集。
将pandas.value_counts传给DataFrame的apply函数:
十三、处理缺失数据
np.nan和python内置的None都会被当作NA处理。
1.滤除缺失数据——dropna
或者直接使用data[data.notnull()]
对于DataFrame,dropna默认丢弃任何含有缺失值的行:
如果使用how='all',那么将只丢弃全为NA的行:
传入axis=1就可以丢弃列。
需要提出的是thresh参数,该参数的类型为整数,它的作用是,比如 thresh=3,会在一行中至少有 3 个非 NA 值时将其保留。
2.填充缺失数据
fillna方法是最主要的函数。
也可以通过一个字典调用fillna,实现对不同的列填充不同的值:
修改一个对象时:
inplace=True:不创建新的对象,直接对原始对象进行修改;
fillna的参数参考:
十四、层次化索引
一个简单的例子:
选取子集的操作:
注意:可以直接在“内层”中进行选取
层次化索引在数据重塑和基于分组的操作(如透视表生成)中扮演者重要的角色
层次化索引后的数据可以通过unstack方法被安排到DataFrame中:
DataFrame的每条轴都可以有分层索引:
可以单独创建MultiIndex然后复用。
十五、重排分级顺序
swaplevel接受两个级别编号或名称,并返回一个互换了级别的新对象。
sortlevel根据单个级别对数据进行排序,且交换级别时常常会用到sortlevel,这样最终的结果就是有序的:
这里的level指的是index的level,0指外层,1指内层:
【如果要对columns的级别进行排序,那么需要加axis=1】
通常使用sortlevel(0)会提升数据选取操作的性能。
十六、根据级别汇总统计
与groupby的功能类似。
set_index函数:将一个或多个列转换为行索引,并创建一个新的DataFrame。
可以设置drop=False将列保留下来。
reset_index的功能和set_index相反,层次化索引的级别会被转移到列里:
最后,注意:如果轴索引含有索引器,那么根据整数进行数据选取的操作总是面向标签的:
如果是根据位置那么[:1]只能选取1行,但此处选取了两行。
当索引非整数时,那么python根据整数进行数据选取会自动求助于位置索引。
如果想要直接进行基于位置的索引,可以使用Series的(iget_value)【无法使用】和DataFrame的iloc方法。
【取行】
【取列】