pandas索引对象

《Python for Data Analysis》

索引对象

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

In [1]: import pandas as pd

In [2]: from pandas import Series, DataFrame

In [3]: import numpy as np

In [4]: index = pd.Index(np.arange(3))

In [5]: index
Out[5]: Int64Index([0, 1, 2], dtype='int64')

In [6]: obj = Series([1.5,2.5,0],index = index)

In [7]: obj
Out[7]:
0    1.5
1    2.5
2    0.0
dtype: float64

重新索引

Series

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

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

In [15]: obj.reindex([0,1,2,3])
Out[15]:
0    1.5
1    2.5
2    0.0
3    NaN
dtype: float64

可以选fill_value = 0

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

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

In [19]: obj1.reindex(range(6), method='ffill')
Out[19]:
0     blue
1     blue
2    green
3    green
4      red
5      red
dtype: object

DataFrame

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

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

In [26]: frame = DataFrame(np.arange(9).reshape((3,3)))

In [27]: frame
Out[27]:
   0  1  2
0  0  1  2
1  3  4  5
2  6  7  8

In [28]: frame.ix[[0,1,2], ['a','b','c']]
Out[28]:
    a   b   c
0 NaN NaN NaN
1 NaN NaN NaN
2 NaN NaN NaN

In [29]: frame.ix[[0,1,2], [0,'b',2]]
Out[29]:
   0   b  2
0  0 NaN  2
1  3 NaN  5
2  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)
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值