pandas索引对象

来源:互联网 发布:网络推广待遇 编辑:程序博客网 时间:2024/06/07 18:45

《Python for Data Analysis》

索引对象

Index对象是不可修改的(immutable),这样才能使Index对象在多个数据结构之间安全共享。

In [1]: import pandas as pdIn [2]: from pandas import Series, DataFrameIn [3]: import numpy as npIn [4]: index = pd.Index(np.arange(3))In [5]: indexOut[5]: Int64Index([0, 1, 2], dtype='int64')In [6]: obj = Series([1.5,2.5,0],index = index)In [7]: objOut[7]:0    1.51    2.52    0.0dtype: float64

重新索引

Series

reindex 创建一个适应新索引的新对象。

调用该Series的reindex将会根据新索引进行重排。如果某个索引值当前不存在,就引入缺失值。默认NaN

In [15]: obj.reindex([0,1,2,3])Out[15]:0    1.51    2.52    0.03    NaNdtype: float64

可以选fill_value = 0

In [16]: obj.reindex([0,1,2,3], fill_value=0)Out[16]:0    1.51    2.52    0.03    0.0dtype: float64

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

In [19]: obj1.reindex(range(6), method='ffill')Out[19]:0     blue1     blue2    green3    green4      red5      reddtype: object

DataFrame

对于DataFrame, reindex可以修改行索引、列索引,或两个都修改。如果仅传入一个序列,默认索引行。使用columns关键字即可重新索引列。插值只能按应用,即轴0.

利用ix标签索引功能,重新索引任务可以变的更加简洁:

In [26]: frame = DataFrame(np.arange(9).reshape((3,3)))In [27]: frameOut[27]:   0  1  20  0  1  21  3  4  52  6  7  8In [28]: frame.ix[[0,1,2], ['a','b','c']]Out[28]:    a   b   c0 NaN NaN NaN1 NaN NaN NaN2 NaN NaN NaNIn [29]: frame.ix[[0,1,2], [0,'b',2]]Out[29]:   0   b  20  0 NaN  21  3 NaN  52  6 NaN  8

丢弃指定轴上的项

drop方法返回一个在指定轴上删除了指定值得新对象。

索引、选取和过滤

利用++标签++的切片运算于普通的Python切片运算不同,++其末端是包含的++!!!即封闭区间。

为了DataFrame的行上进行标签索引,引入了专门的索引字段ix

类型 说明 obj[val] 选取DataFrame的单个列或一组列。 obj.ix[val] 选取DataFrame的单个行或一组行。 obj.ix[:,val] 选取单个列或列子集 obj.ix[val1,val2] 同时选取行和列 reindex 将一个或多个轴匹配到新索引

层次化索引

创建一个Series,并用一个由列表或数组组成的列表作为索引。

重塑层次化索引

  • stack: 将数据的列“旋转”为行。
  • unstack: 将数据的行“旋转”为列。(默认,unstack操作的是最内层;可以传入分层级别编号或名称)

层次化索引的Series可以通过其unstack方法被重新安排到一个DataFrame中。

unstack的逆运算是stack。

使用DataFrame的列

DataFrame的set_index函数会将其一个或多个列转换为行索引,并创建一个新的DataFrame.

reset_index的功能跟set_index刚好相反,层次化索引的级别会被转移到列里面。类似于(unstackstack的关系)

重命名轴索引rename

rename实现了复制DataFrame并对其索引和列标签进行赋值。如果希望就地修改某个数据集,传入inplace=True即可。

实践

example 1:

title_test1 = title_test1.set_index('Label') # 将‘Label’列作为索引

example 2:

accepted_answers = answers[answers.IsAcceptedAnswer == True]accepted_answers["OwnerUserId"].value_counts().head(10).plot(kind="barh")accepted_answers = accepted_answers.drop(['Id','CreationDate','Score','IsAcceptedAnswer' ,'Body'], axis=1)col_mapping = {'OwnerUserId' : 'ExpertId',               'ParentId' : 'Id'}accepted_answers = accepted_answers.rename(columns=col_mapping, copy = False)accepted_answers = accepted_answers.dropna()count = accepted_answers['ExpertId'].value_counts()count_df = pd.DataFrame(count)count_df = count_df.reset_index()col_mapping2 = {'ExpertId' : 'Count',                'index' : 'ExpertId'}count_df = count_df.rename(columns=col_mapping2, copy = False)
0 0
原创粉丝点击