In[1]:from pandas import Series, DataFrame
In[2]:import pandas as pd
pandas主要熟悉它的两个主要数据结构: Series和DataFrame
Series
series是一种类似一维数组的对象,由一组数据(各种np数据类型)以及一组与之相关的数据标签(索引)组成。
- 可以通过Series的value和index属性获取数组表示形式和索引对象。
- 如果没有为数据指定索引,则会自动创建一个0到n-1的整数型索引。
```python
obj = Series([4,77,-5,3],index=['d','v','a','c'])
- 与普通np数组相比,可以通过索引方式选取Series中的单个或一组值;
```python
obj['a','d'.'c']
- np数组运算(如根据布尔型数组进行过滤、标量乘法、应用数学函数)都会保留索引和值之间的链接。如下:
- 可把Series看成是一个定长的有序字典,因为它是索引值到数据值的一个映射。可以用在原本需要字典参数的函数中。
‘b' in obj
- 如果数据被存放再一个py字典中,也可以直接通过这个字典来创建Series。索引即为字典的键,通过键找不到的值其结果就为NaN(即“非数字” not a number)
#sdata是个字典
obj3 = Series(sdata)
- pandas的isnull和notnull函数可用于检测缺失数据。
- series的一个最重要的功能是:它在算术运算中会自动对齐不同索引的数据。
- series对象本身及其索引都有一个name属性,该属性跟pandas其它的关键功能关系非常密切。
- series的索引可以通过赋值的方式就地修改。
DataFrame
- 构建DataFrame的方法有很多,最常用的一种是直接传入一个由等长列表或np数组组成的字典。DataFrame会自动加上索引。传入的列在数据中找不到就会产生NA值。
- 如果指点了序列,则DF的列就会按照指定顺序进行排列。
- 通过类似字典标记的方式或属性的方式,可以将DF的列获取为一个Series:
注意:返回的Series拥有和原DF相同的索引,且其name属性也被相应地设置好了。 - 行也可以用过位置或名称的方式进行获取,比用索引字段ix。
frame2.ix['three']
- 行和列都可以直接赋值修改。
- 将列表或数组赋值赋值给某个列时,其长度必须跟DF的长度相匹配。如果赋值的是Series,就会精确匹配DF的索引,索引的空位都将被填上缺失值。为不存在的列赋值会创建出新列,用del删除。
del frame2['easten']
- 通过索引返回的列只是相应数据视图而已,不是副本。对返回的Series所做的任何修改都会反映到原DF。通过Series的copy方法即可显式地复制列。
- 另一种常见的构造方式式嵌套字典。如果将它传给DF,将被解释为:外层字典的键作为列,内层键则作为行索引。
pop = {'Nevada':{2001;2.4. 2002:2.9},
...:'Ohio':{2000:1.5, 2001:1.7,2002:3.6}}
frame3 = DataFrame(pop)
Out:
Nevada Ohio
2000 NaN 1.5
2001 2.4 1.7
2002 2.9 3.6
- 也可以对结果进行转置。
frame.T
- 如果显示指定了索引,则会剔除给定索引之外的数据。
因为series的index的索引是2002、2001,是已经给定的。如果没有给定则可以使用0,1索引。而切片不同,切片本就是用0,1数字代表位置。series的索引可以是位置数字和给定索引同时用- 跟Series一样,value属性也会以二维ndarray的形式返回Dataframe中的数据。如果各列的数据类型不同,则值数组的数据类型就会选用能兼容所有列的数据类型。
- pandas的索引对象负责管理轴标签和其它元数据(比如轴名称)。构建Series或DataFrame时,所用到的任何数组或其它序列的标签都会被转换成一个Index。
- Index对象不可单个修改,可以obj.index=[…] ,不可以obj.index[0] = ‘c’。不可修改性才可以使Index对象在多个数据结构之间安全共享。
- 除了长得像数组,Index的功能也类似一个固定大小的集合。每个索引都有一些方法和属性,它们可以用于设置逻辑并回答有关该索引所包含的数据的常见问题
- index是行索引而columns是列索引。
基本功能
- pandas对象的一个重要方法reindex,其作用使创建一个适应新索引的新对象。
obj = Series([4.5,7.2,-5.3,3.6],index=['d','b','a','c'])
obj2= obj.reindex(['a','b','c','d','e'])
#调用该Series的reindex将会根据新索引进行重排。如果某个索引值当前不存在,就引入缺失值NaN。
obj2= obj.reindex(['a','b','c','d','e'],fill_value=0)
#或者通过fill_value引入其它值
- 对于时间序列这样的有序数据,重新索引时可能需要做一些插值处理。method选项即可达到此目的。例如,使用ffill可以实现前向值填充。
obj3= Series(['blue','purple','yellow'],index=[0,2,4])
obj3.reindex(range(6),method='ffill')
- 对于DF,reindex可以修改(行)索引、列,或两个都修改。如果仅传入一个序列,则只会重新索引行。使用columns关键字即可重新索引列。
frame2 = frame.reindex(['a','b','c','d'])
states = ['Texas','Utah','California']
frame.reindex(columns = states)
#行和列同时索引
frame.reindex(index=['a','b','c','d'],method ='ffil',comlumns=states)
3.利用ix标签索引功能,重新索引任务可以变得更简洁,ix上的索引是闭区间
frame.ix[['a','b','c','d'],states]
4.使用drop方法返回的是一个在指定轴上删除了指定值的新对象。
#Series
obj.drop('c')
obj.drop(['d','c'])#删除两个标签,都是行
#DataFrame
data.drop(['Colorado','Ohio])#删除两个行
data.data('two’,axis=1)#删除一个列
- 标签的切片运算与普通的Python切片运算不同,其末端是包含的),右闭合。
obj['b':'c']
- 对DF进行索引是获取列。
data['one']
得到列
ix通常会尝试像loc(标签)一样行为,但如果索引中不存在标签,则会退回到像iloc(数字代表的位置索引)一样的行为
data['one'] 得到列
data[0:1]得到行
data.ix[[行标签][列标签]] 得到区域而不是元素值
data.ix['s'] 得到行
data.ix[0] 得到行
data.ix[:,0] 得到列
data.ix[:,'one'] 得到列
data.ix[['Coliirado','Utah'],[3,0,1]] 得到两行,而列的顺序发生改变
算术运算和数据对齐
- pandas可以对不同索引的对象进行算术运算。在将对象相加时,如果不存在不同的索引对,则结果的索引就是该索引对的并集(只有两个对象有相同的索引时相加才不会NaN)。
- 自动的数据对齐操作在不重叠的索引处引入了NA值。缺失值会在算术运算过程中传播。
- 没有重叠的位置就会产生NaN值,使用其中一个对象的add方法,传入另外一个对象以及一个fill_value参数。
df1.fill_value=0
,df1.reindex(columns=df2.columns,fill_value=0
- 如果某个索引值在DF的列或Series的索引中找不到,则参与运算的两个对象就会被重新索引以形成并集。
- 默认情况下,DF和Series之间的算术运算会将Series的索引匹配到DF的列索引,然后沿着行一直向下传播。如果希望匹配行且在列上广播(上例在行上广播),则必须使用算术运算方法。
7.axis = 0 ,沿竖直方向,即沿行向下传播。
函数应用和映射
- Numpy的ufuncs(元素级数组方法)也可用于操作pandas对象。
- 将函数应用到由各列或行形成的一维数组上。DF的apply方法即可实现此功能。
3. 除标量值外,传递给apply的函数还可以返回由多个值组成的Series。
4. 也可以用元素级的Python函数。加入想得到frame中各个浮点值的格式化字符串,使用applymap即可。
5. Series有一个应用元素级函数的map方法。
排序和排名
数据集排序(sorting)也是一种重要的内置运算。
- 要对行或列索引进行排序(按字典顺序),可使用sort_index方法,它将返回一个已排序的新对象。
obj = Series(range(4),index=['d','a','b','c'])
- 面对DF,则可以根据任意一个轴上的索引进行排序。
- 数据默认是按升序排序的,但也可以降序排列。
frame.sort_index(axis=1,ascending=False)
- 要按值对Series进行排序,可使用其order方法。
obj.order()
在排序时,任何缺失值默认都会被放到Series的末尾。 - 根据列中的值进行排序。将一个或多个列的名字传递给by选项即可达到该目的。frame.sort_index(by=[‘a’,‘b’])
- 排名(ranking)跟排序关系密切,且它会增设一个排名值。(从1开始,一直到数组中有效数据的数量)。 默认情况下,rank是通过“为各组分配一个平均排名”的方式破坏平级关系的。
obj.rank()
- 也可以根据值在原数据中出现的顺序给出排名。
obj.rank(method='first')
- 也可以按降序进行排名。
obj.rank(ascending=False, method='max')
带有重复值的轴索引
虽然许多pandas函数都要求标签唯一,但这并不是强制性。
- 索引的is_unique属性可以告诉你它的值是否是唯一的。
- 对于带有重复值的索引,数据选取的行为将会有些不同。如果某个索引对应多个值,则返回一个Series,而对应单个值的,则返回一个标量值。使用DF的行进行索引也是如此
汇总和计算描述统计
-
pd对象拥有一组常用的数学和统计方法,调用DF的sum方法将会返回一个含有列小计的Series。 NA值会自动被排除,除非整个切片都是NA。通过skipna选项可以禁用该功能。
-
有些方法返回的是间接统计(比如达到最小值或最大值的索引)
-
另一些方法则是累计型。
-
还有一种方法既不是简约型也不是累计型。
对于非数值数据
相关系数与协方差
有些汇总统计是通过参数对计算出来的。
- Series的corr方法用于计算两个Series中重叠的、非NA的、按索引对齐的值的相关系数。 cov用于计算协方差。 DF的corr和cov方法将以DF的形式返回完整的相关系数或协方差矩阵。
- 利用DF的corrwith方法,可以计算其列或行跟另一个Series或DF之间的相关系数。
唯一值、值计数以及成员资格
uniques = obj.unique()
可以得到Series中的唯一值数组,返回的唯一值是未排序的,如果需要的话,可以对结果再次进行排序(uniques.sort())obj.value_counts()
用于计算Series中各值出现的频率。为了便于查看,结果Series是按值频率降序排列的。value_counts还是各顶级pandas方法,可用于任何数组或序列。- isin, 它用于判断矢量化集合的成员资格,可用于选取Series中或DF中数据的子集。
mask = obj.isin(['b','c'])
处理缺失数据
pandas使用浮点值NaN表示浮点和非浮点数组中的缺失数据。Python内置的None值也会被当做NA处理。
滤除缺失数据
- dropna对于一个Series,dropna返回一个仅含非空数据和索引值的Series。对于DF对象,可能希望丢弃全NA或含有NA的行或列。**dropna默认丢弃任何含有缺失值的行。**传入how='all’将只丢弃全为NA的那些行。
- 另外一个滤除DF行的问题涉及时间序列数据。假设只想留下一部分观测数据,可以用thresh参数实现此目的。
填充缺失数据
有时可能不想滤除缺失数据(有可能会丢弃跟它有关的数据),而是希望通过其它方式填补那些“空洞”。 对于大多数情况而言,fillna方法是最主要的函数。通过一个常数调用fillna就会将缺失值替换为那个常数值。
若是通过一个字典调用fillna,就可以实现对不同的列填充不同的值。
fillna默认会返回新对象,但也可以对现有对象进行就地修改。
层次化索引
层次化索引(hierarchical indexing)是pandas的一项重要功能,它能使你在一个轴上拥有多个索引级别。
这就是带有MultiIndex索引的Series的格式化输出形式。
有时也可以在“内层”中进行选取:
层次化索引在数据重塑和基于分组的操作(如透视表生成)中扮演着重要的角色。
比如,可以将层次化索引通过其unstack方法重新安排到一个DF中。data.unstack()
unstack的逆运算是stack
-
重排分级顺序:swaplevel接收两个级别的编号或名称,并返回一个互换了级别的新对象。 而sortlevel则根据单个级别中的值对数据进行排序,交换级别时,常常也会用到sortlevel,这样最终结果就是
有序的了。 -
根据级别汇总统计
许多对DF和Series的描述和汇众统计都有一个level选项,它用于指定在某条轴上求和的级别。p167 -
DF的set_index函数会将其一个或多个列转换为行索引,并创建一个新的DF。
-
reset_index的功能跟set_index刚好相反,层次化索引的级别会被转移到列里面。
其它有关pandas的话题
- 整数索引:
ser = Series(np.arange(3.))
ser[-1]
使用索引时很难判断出是基于标签或位置的索引。相反,对于非整数索引就没有这种歧义
使用iloc、loc、ix方法的标签
- 面板数据
pandas有一个Panel数据结构,可以将其看作一个三维版的DF。可以用一个由DF对象组成的字典或一个三维ndarray来创建对象。
在二维DF下加入层次索引形成堆积式的三维DF。