当前位置: 首页>移动开发>正文

多层索引dataframe拼接 dataframe分层索引

1 分层索引

很多应用中,数据可能分布在多个文件或数据库中,抑或是某种不易于分析的格式进行排列,对这些进行数据联合,链接以及重拍列。
分层索引是pandas的重要特性,允许你在一个轴向上拥有多个索引层级。

data = pd.Series(np.random.randn(9),
                 index=[['a', 'a', 'a', 'b', 'b', 'c', 'c', 'd', 'd'],
                        [1, 2, 3, 1, 3, 1, 2, 2, 3]])
data
a  1    1.246435
   2    1.007189
   3   -1.296221
b  1    0.274992            # 这是一个以MultiIndex 作为索引的series 美化图。
   3    0.228913
c  1    1.352917
   2    0.886429
d  2   -2.001637
   3   -0.371843
dtype: float64
MultiIndex([('a', 1),
            ('a', 2),                   # 额,,为啥和书上的不一样啊///
            ('a', 3),
            ('b', 1),
            ('b', 3),
            ('c', 1),
            ('c', 2),
            ('d', 2),
            ('d', 3)],
           )

data['b':'c']
data.loc[['b','d']]              # 各种分层索引,,部分索引。
data.loc[:,2]
a    1.007189
c    0.886429              # b 没有索引 2 所以就跳过了
d   -2.001637
dtype: float64


data.unstack()             # 使用这个方法将数据在 dataframe 中重新排列,就是把123 那层索引去了
           1	2	3
a	-1.647827	2.397676	0.188066      # 额,这随机的数据不是原来那个了。。让我给重搞了。。
b	0.860510	NaN	1.747142
c	0.321955	1.026804	NaN
d	NaN	-1.083873	-0.487780

data.unstack().stack()         # stack 是反操作
a  1   -1.647827
   2    2.397676
   3    0.188066
b  1    0.860510
   3    1.747142
c  1    0.321955
   2    1.026804
d  2   -1.083873
   3   -0.487780
dtype: float64

frame = pd.DataFrame(np.arange(12).reshape((4, 3)),
                     index=[['a', 'a', 'b', 'b'], [1, 2, 1, 2]],
                     columns=[['Ohio', 'Ohio', 'Colorado'],
                               ['Green', 'Red', 'Green']])
frame
		Ohio	Colorado
   Green	Red	Green               # dataframe 中,每个轴都可以拥有分层索引:
a	1	0	1	2
2	3	4	5
b	1	6	7	8
2	9	10	11

frame.index.names=['key1','key2']         # 分层的层级可以有名称(字符串或python对象)
frame.columns.names=['state','color']
frame
	state	Ohio	Colorado             # 额,,还是控制台输出的更好看。。
color	Green	Red	Green
key1	key2			
a	1	0	1	2
2	3	4	5
b	1	6	7	8
2	9	10	11

frame['Ohio']             # 通过部分列索引,可以选出列中的组。
	color	Green	Red
key1	key2		
a	1	0	1
2	3	4
b	1	6	7
2	9	10


# 一个 MultIndex 对象可以使用自身的构造函数创建并服用。
index = pd.MultiIndex.from_arrays([['Ohio', 'Ohio', 'Colorado'], ['Green', 'Red', 'Green']], names=['state', 'color'])
MultiIndex([(    'Ohio', 'Green'),
            (    'Ohio',   'Red'),
            ('Colorado', 'Green')],
           names=['state', 'color'])
pd.DataFrame(np.arange(9).reshape(3,3),index=index)    # 根据创建的 MultIndex 对象来创建一个dataframe。
                 0	1	2
state	   color			
Ohio	   Green	0	1	2
             Red	3	4	5
Colorado	Green	6	7	8

1.1 重排序和层级排序

有时,你需要重新排列轴上的层级顺序,或者按照特定层级的值对数据进行排序。 swaplevel 接收两个层级序号或层级名称,返回一个进行了层级变更的新对象(但是数据是不变的).

frame
	state	Ohio	Colorado
   color	Green	Red	Green
key1key2			
a	1	0	1	2
    2	3	4	5
b	1	6	7	8
    2	9	10	11

frame.swaplevel('key1','key2')
	state	Ohio	Colorado
color	Green	Red	Green
key2key1			
1	a	0	1	2
2	a	3	4	5
1	b	6	7	8
2	b	9	10	11

# 另一方面,sort_index 只能在单一层级上对数据进行排序,在进行层级变换时,使用这个是结果按照层级进行字典排序
frame.sort_index(level=1)

state	Ohio	Colorado
color	Green	Red	Green
key1	key2			
a	1	0	1	2
b	1	6	7	8
a	2	3	4	5
b	2	9	10	11

frame.swaplevel(0,1).sort_index(level=0)         # 最后这个就是.sort_index()
	state	Ohio	Colorado
color	Green	Red	Green
key2	key1			
1	a	0	1	2
    b	6	7	8
2	a	3	4	5
    b	9	10	11

1.2 按层级进行汇总统计

dataframe and series 中有很多描述性和汇总哦统计有一个 level 选项,通过level 选项可以指定你想要在某个特定的轴上进行聚合。

frame
state	Ohio	Colorado
color	Green	Red	Green
key1	key2			
a	1	0	1	2
    2	3	4	5
b	1	6	7	8
    2	9	10	11
frame.sum(level='key2')          # 就是 1 2 索引对应的数值相加。。
state	Ohio	Colorado
color	Green	Red	Green
key2			
1	6	8	10
2	12	14	16
frame.sum(level='color',axis=1)
	color	Green	Red
key1	key2		
a	1	2	1
    2	8	4           # 两个 Green 合并了
b	1	14	7
    2	20	10

1.3 使用 Dataframe 的列进行索引

通常我们不会使用dataframe 中一个或多个列作为索引,反而你可能想要将行索引移动到 dataframe 的列中。

frame = pd.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]})
frame
   a	b	c	d
0	0	7	one	0
1	1	6	one	1
2	2	5	one	2
3	3	4	two	0
4	4	3	two	1
5	5	2	two	2
6	6	1	two	3

frame2=frame.set_index(['c','d'])     # set_index 函数生成使用一个或多个列作为索引的 dataframe 
frame2
       a	b
c	d		
one	0	0	7
    1	1	6      # 这将 c d 作为了列索引啊,,
    2	2	5
two	0	3	4
    1	4	3
    2	5	2
    3	6	1

frame.set_index(['c','d'],drop=False)         # 默认会将这些列移除,也可以将他们留在里面
		a	b	c	d
c	d				
one	0	0	7	one	0
    1	1	6	one	1
    2	2	5	one	2
two	0	3	4	two	0
    1	4	3	two	1
    2	5	2	two	2
    3	6	1	two	3

frame2.reset_index()              # 这个是反操作,将分层索引的索引层搞到列中


额又整出了些幺蛾子。。。。。这些收益是什么呢,会不会有人试试呢。。。。


https://www.xamrdz.com/mobile/47k1942036.html

相关文章: