《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
刚好相反,层次化索引的级别会被转移到列里面。类似于(unstack
与stack
的关系)
重命名轴索引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)