Pandas入门

pandas是基于Numpy构建的,让以Numpy为中心的应用变得更加简单。

pandas的数据结构介绍
要使用pandas,你首先得熟悉它的两个主要数据结构:Series和DataFrame。

1. Series
1.1. Series是一种类似于一维数组的对象,它由一组数据(各种Numpy数据类型)以及一组与之相关的数据标签(即索引)组成。由于我们没有为数据指定索引,于是会自动创建一个0到N-1(N为数据的长度)的整数型索引。你可以通过Series的values和index属性获取其数组表示形式和索引对象。

1.2. Numpy数组运算都会保留索引和值之间的链接; 如果数据被存放在一个Python字典中,也可以直接通过这个字典来创建Series

1.3. 对于许多应用而言,Series最重要的一个功能是:它在算术运算中会自动对齐不同索引的数据。

2. DataFrame
2.1 DataFrame是一个表格型的数据结构,它含有一组有序的列,每列可以是不同的值类型(数值、字符串、布尔值等)。

2.2 DataFrame既有行索引也有列索引,它可以被看做由Series组成的字典(共用同一个索引)。通过类似字典标记的方式或属性的方式,可以将DataFrame的列获取为一个Series。注意,返回的Series拥有原DataFrame相同的索引,且其name属性也已经被相应地设置好了。

2.3. 行可以通过位置或名称的方式进行获取,比如用索引字段ix; 列可以通过赋值的方式进行修改。

2.4. 另一种常见的数据形式是嵌套字典(也就是字典的字典),如果将它传给DataFrame,它就会被解释为:外层字典的键作为列索引,内层键则作为行索引。

2.5. 跟Series一样,values属性也会以二维ndarray的形式返回DataFrame中的数据;如果DataFrame各列的数据类型不同,则值数组的数据类型就会选用能兼容所有列的数据类型。

3. 索引对象
构建Series或DataFrame时,所用到的任何数组或其他序列的标签都会被转换成一个Index;Index对象是不可修改的,因此用户不能对其进行修改。

基本功能
将介绍操作Series和DataFrame中的数据的基本手段。

1. 重新索引
1.1. pandas对象的一个重要方法是reindex,其作用是创建一个适合新索引的新对象。Series调用reindex将会根据新索引进行重排。如果某个索引值当前不存在,就引入缺失值。

1.2. 对于时间序列这样的有序数据,重新索引时可能需要做一些插值处理。method选项即可达到此目的,例如,使用ffill可以实现前向值填充。

1.3. 对于DataFrame,reindex可以修改(行)索引、列、或两个都修改。如果仅传入一个序列,则会重新索引行。使用columns关键字即可重新索引列。

2. 丢弃指定轴上的项

2.1. 丢弃某条轴上的一个或多个项很简单,只要有一个索引数组或列表即可。由于需要执行一些数据整理和集合逻辑,所以drop方法返回的是一个在指定轴上删除了指定值的新对象。

2.2. 对于DataFrame,可以删除任意轴上的索引值。

3. 索引、选取和过滤

3.1. Series索引的工作方式类似于Numpy数组的索引,只不过Series的索引值不只是整数。

3.2. 利用标签的切片运算与普通的Python切片运算不同,其末端是包含的。

4. 算术运算和数据对齐

4.1. pandas最重要的一个功能是,它可以对不同索引的对象进行算术运算。在将对象相加时,如果存在不同的索引对,则结果的索引就是该索引对的并集。(自动的数据对齐操作在不重叠的索引处引入了NA值)

4.2. 对于DataFrame,对齐操作会同时发生在行和列上。它们相加后将会返回一个新的DataFrame,其索引和列为原来那两个DataFrame的并集。

5. 在算术方法中填充值
5.1. 在对不同索引的对象进行算术运算时,你可能希望当一个对象中某个轴标签在另一个对象中找不到时填充一个特殊值。将它们相加(df1+df2)时,没有重叠的位置就会产生NA值,这时可以使用df1的add方法,传入df2以及一个fill_value参数。

6. DataFrame和Series之间的运算
6.1. 默认情况下,DataFrame和Series之间的算术运算会将Series的索引匹配到DataFrame的列,然后沿着行一直向下广播。如果某个索引值在DataFrame的列或Series的索引中找不到,则参与运算的两个对象就会被重新索引以形成并集。

6.2. 如果你希望匹配行且在列上广播,则必须使用算术运算方法,例如(frame.sub(series3,axis=0))传入的轴号就是希望匹配的轴。在本例中,我们的目的是匹配DataFrame的行索引并进行广播(沿着列广播)。

7. 函数应用和映射

7.1. Numpy的ufuncs(元素级数组方法)也可用于操作pandas对象。另一个常见的操作是,将函数应用到由各列或行所形成的一维数组上。DataFrame的apply方法即可实现此功能。

8. 排序和排名
8.1. 根据条件对数据集排序也是一种重要的内置运算。要对行或列索引进行排序,可使用sort_index方法,它将返回一个已排序的新对象。

8.2. 若要按值对Series进行排序,可使用其order方法。在排序时,任何缺失值默认都会放到Series的末尾。

8.3. 在DataFrame上,你可能希望根据一个或多个列中的值进行排序。将一个或多个列的名字传递给by选项即可达到该目的;要根据多个列进行排序,传入名称的列表即可。

8.4. 排名(ranking)跟排序关系密切,且它会增设一个排名值。它跟numpy.argsort产生的间接排序索引差不多,只不过它可以根据某种规则破坏平级关系。

8.5. 默认情况下,rank是通过”为各组分配一个平均排名”的关系破坏平级关系(obj.rank());也可以根据值在原数据中出现的顺序给出排名(obj.rank(method=”first”))

9. 带有重复值的轴索引
虽然许多pandas函数都要求标签唯一,但这并不是强制性的。

9.1. 对于带有重复值的索引,数据选取的行为将会有些不同。如果某个索引对应与多个值,则返回一个Series;而对应单个值,则返回一个标量值;对DataFrame的行进行索引也是如此。

汇总和计算描述统计

1.1. 调用DataFrame的sum方法将会返回一个含有列小计的Series;传入axis=1将会按行进行求和运算,NA值会自动被排除,除非整个切片(这里值的是行或列都是NA)。通过skipna选项可以禁用该功能(df.mean(axis=1,skipna=False))。

1.2. 有些方法(如idxmin和idxmax)返回的是间接统计(比如达到最小值或最大值的索引);另一些方法则是累计型的(df.cumsum())。还有一种方法,它既不是约简型也不是累计型。describe就是一个例子,它用于一次性产生多个汇总统计。

2. 相关系数与协方差

2.1. Series的corr方法用于计算两个Series中重叠的、非NA的、按索引对齐的值的相关系数。与此类似,cov用于计算协方差。

2.2. DataFrame的corr和cov方法将以DataFrame的形式返回完整的相关系数或协方差矩阵;利用DataFrame的corrwith方法,你可以计算其列或行跟另一个Series或DataFrame之间的相关系数。传入一个Series将会返回一个相关系数值Series(针对各列进行计算)。

3. 唯一值、值计数以及成员资格

3.1. 还有一类方法可以从一维Series的值中抽取信息。第一个函数是unique,它可以得到Series中的唯一值数组。返回的唯一值是未排序的,如果需要的话,可以对结果再次进行排序(uniques.sort())

3.2. value_counts用于计算一个Series中各值出现的频率,为了便于查看,结果Series是按值频率降序排列的。

3.3. 最后是isin,它用于判断矢量化集合的成员资格,可用于选取Series中或DataFrame列中数据的子集。

处理缺失数据
缺失数据(missing data)在大部分数据分析应用中都很常见。pandas的设计目标之一就是让缺失数据的处理任务尽量轻松。pandas使用浮点值NaN(Not a number)表示浮点数和非浮点数组中的缺失数据。它只是一个便于被检测出来的标记而已。

1. 滤除缺失数据

1.1. 过滤掉缺失数据的办法有很多种,纯手工操作永远都是一个办法,但dropna可能会更实用些。对于一个Series,dropna返回一个仅含有非空数据和索引值的Series。

1.2. 而对于DataFrame对象,你可能希望丢弃全NA或含有NA的行或列。dropna默认丢弃任何含有缺失值的行(传入how=’all’将只丢弃全为NA的那些行)。要用这种方式丢弃列,只需要传入axis=1即可。

1.3. 另一个滤除DataFrame行的问题涉及时间序列数据。假设你只想留下一部分观测数据,可以用thresh参数实现此目的。

2. 填充缺失数据

2.1. 你可能不想滤除缺失数据,而是希望通过其他方式填补那些”空洞”。对于大多数情况而言,fillna方法是最主要的函数。通过一个常数调用fillna就会将缺失值替换为那个常数值。

2.2. 若是通过一个字典调用fillna,就可以实现对不同的列填充不同的值(df.fillna({1:0.5,3:-1}))。

2.3. fillna默认会返回新对象,但也可以对现有对象进行就地修改。

层次化索引
层次化索引是pandas的一项重要功能,它使你能在一个轴上拥有多个(两个以上)索引级别。

1. 重排分级顺序

1.1. 有时,你需要重新调整某条轴上各级别的顺序,或根据指定级别上的值对数据进行排序。swaplevel接受两个级别编号或名称,并返回一个互换了级别的新对象(但数据不会发生变化)。

2. 根据级别汇总统计

2.1. 许多对DataFrame和Series的描述和汇总统计都有一个level选项,它用于指定在某条轴上求和的级别。

3. 使用DataFrame的列

3.1. 人们经常想要将DataFrame的一个或多个列当做行索引来用,或者可能希望将行索引变成DataFrame的列。

3.2. DataFrame的set_index函数会将其一个或多个列转换为行索引,并创建一个新的DataFrame。默认情况下,那些列会从DataFrame中移除,但也可以将其保留下来(frame.set_index([‘c’,’d’],drop=False))。

3.3. reset_index的功能跟set_index刚好相反,层次化索引的级别会被转移到列里面。

  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值