层次化索引(MultiIndex)
- 使你能在一个轴上拥有多个(两个以上)索引级别。抽象的说,它使你能以低纬度形式处理高维度数据。
#'Series的层次索引'
data = Series(np.random.randn(10), index = [['a', 'a', 'a', 'b', 'b', 'b', 'c', 'c', 'd', 'd'], [1, 2, 3, 1, 2, 3, 1, 2, 2, 3]])print(data)print(data.index)print(data.b)print(data['b':'c'])print(data[:2])#0-2print(data.unstack())print(data.unstack().stack())
# 'DataFrame的层次索引'
frame = DataFrame(np.arange(12).reshape((4, 3)), index = [['a', 'a', 'b', 'b'], [1, 2, 1, 2]], columns = [['Ohio', 'Ohio', 'Colorado'], ['Green', 'Red', 'Green']])print(frame)frame.index.names = ['key1', 'key2']frame.columns.names = ['state', 'color']print(frame)print(frame.ix['a', 1])print(frame.ix['a', 2]['Colorado'])print(frame.ix['a', 2]['Ohio']['Red'])
#'直接用MultiIndex创建层次索引结构'
print(MultiIndex.from_arrays([['Ohio', 'Ohio', 'Colorado'], ['Gree', 'Red', 'Green']], names = ['state', 'color']))
层次化索引 重新分级顺序
- 索引交换
- 索引重新排序
# '索引层级交换'
frame = DataFrame(np.arange(12).reshape((4, 3)), index = [['a', 'a', 'b', 'b'], [1, 2, 1, 2]], columns = [['Ohio', 'Ohio', 'Colorado'], ['Green', 'Red', 'Green']])frame.index.names = ['key1', 'key2']frame_swapped = frame.swaplevel('key1', 'key2')print(frame)print(frame_swapped)print(frame_swapped.swaplevel(0, 1))
# '根据索引排序'
print(frame.sortlevel('key2'))print(frame.swaplevel(0, 1).sortlevel(0))
层次化索引 根据级别汇总统计
- 指定索引级别和轴
frame = DataFrame(np.arange(12).reshape((4, 3)), index = [['a', 'a', 'b', 'b'], [1, 2, 1, 2]], columns = [['Ohio', 'Ohio', 'Colorado'], ['Green', 'Red', 'Green']])frame.index.names = ['key1', 'key2']print(frame)print(frame.sum(level = 'key2'))
层次化索引 使用DataFrame的列
- 将指定列变为索引
- 移除或保留对象
- reset_index恢复
#'使用列生成层次索引'
frame = DataFrame({'a':range(7), 'b':range(7, 0, -1), 'c':['one', 'one', 'one', 'two', 'two', 'two', 'two'], 'd':[0, 1, 2, 0, 1, 2, 3]})print(frame)print(frame.set_index(['c', 'd'])) # 把c/d列变成索引print(frame.set_index(['c', 'd'], drop = False) )# 列依然保留frame2 = frame.set_index(['c', 'd'])print(frame2.reset_index())
读取数据
- http://pandas.pydata.org/pandas-docs/stable/user_guide/io.html
- http://www.cnblogs.com/datablog/p/6127000.html
- pandas.read_csv可以读取CSV(逗号分割)文件、文本类型的文件text、log类型到DataFrame
names = ['date', 'time', 'opening_price', 'ceiling_price', 'floor_price', 'closing_price', 'volume', 'amount']raw = pd.read_csv('SH600690.csv', names = names, header = None, index_col='date', parse_dates=True)print(raw.head()) stock=pd.read_csv("data.csv")stock2=pd.read_table('data.csv',sep=',') stock.to_csv('test1.csv')
- sep:如果不指定参数,则会尝试使用逗号分隔。
- header :指定行数用来作为列名,数据开始行数。如果文件中没有列名,则默认为0【第一行数据】,否则设置为None。如果明确设定 header = 0 就会替换掉原来存在列名。header参数可以是一个list例如:[0,1,3],这个list表示将文件中的这些行作为列标题(意味着每一列有多个标题),介于中间的行将被忽略掉。
- names :用于结果的列名列表,如果数据文件中没有列标题行,就需要执行 header=None。names属性在header之前运行默认列表中不能出现重复,除非设定参数mangle_dupe_cols=True。
- index_col :用作行索引的列编号或者列名,如果给定一个序列则有多个行索引。
- skiprows :需要忽略的行数(从文件开始处算起),或需要跳过的行号列表(从0开始)。
- nrows :需要读取的行数(从文件头开始算起)。
- skip_blank_lines :如果为True,则跳过空行;否则记为NaN。
- sep:如果不指定参数,则会尝试使用逗号分隔。分隔符长于一个字符并且不是‘s+’,将使用python的语法分析器。并且忽略数据中的逗号。正则表达式例子:’’。
- delimiter :定界符,备选分隔符(如果指定该参数,则sep参数失效)