普通列和行Index相互转化
import numpy as np
import pandas as pd
from pandas import Series
from pandas import DataFrame
1
2
3
4
2
3
4
data = [[1,2,3],[4,5,6]]
index = ['a','b']
columns = ['A','B','C']
df = pd.DataFrame(data, index = index, columns = columns)
df
1
2
3
4
5
2
3
4
5
A | B | C | |
---|---|---|---|
a | 1 | 2 | 3 |
b | 4 | 5 | 6 |
# 普通列转化为行索引
DataFrame.set_index(keys, drop=True, append=False, inplace=False)
- keys:用于转化的列名称,列名或列名的列表,如果是列表则转化为多重索引;
- drop:True or False,是否保留原列;
- append:True or False,是否保留当前索引;
- inplace:True or False,是否原地修改。
# DataFrame 中的列
**注意:**下面的这种用法只能处理单层列索引情况。
df.set_index('A', drop = True, append = False) #单列转化为行索引,列名作为索引的名字
1
B | C | |
---|---|---|
A | ||
1 | 2 | 3 |
4 | 5 | 6 |
df.set_index(['A','B'], drop = True, append = False) # 列名的列表
1
C | ||
---|---|---|
A | B | |
1 | 2 | 3 |
4 | 5 | 6 |
df.set_index(['A','C'], drop = False, append = False) # drop = False, 保留原列
1
A | B | C | ||
---|---|---|---|---|
A | C | |||
1 | 3 | 1 | 2 | 3 |
4 | 6 | 4 | 5 | 6 |
df.set_index(['A','C'], drop = False, append = True) # append = True, 保留原索引
1
A | B | C | |||
---|---|---|---|---|---|
A | C | ||||
a | 1 | 3 | 1 | 2 | 3 |
b | 4 | 6 | 4 | 5 | 6 |
# 任意列
- 普通列不是必须为 DataFrame 中的列,任何行数匹配的列表或列表的元组都可以;
- 此方法可以处理多层列索引情况,方法是先提取需要的列,构建成元组,再来替换索引。
li = ['c','d']
df.set_index(keys = [li], append = False)# 注意是[li]不是li,如果是单层,会当做列名处理
## append为False,实现了改索引功能
1
2
3
2
3
A | B | C | |
---|---|---|---|
c | 1 | 2 | 3 |
d | 4 | 5 | 6 |
#如果是多层索引情况,append为False,所有索性会被替换
df1 = df.set_index(keys = [li], append = True)
df1
1
2
3
2
3
A | B | C | ||
---|---|---|---|---|
a | c | 1 | 2 | 3 |
b | d | 4 | 5 | 6 |
df1.set_index(keys = [['e','f']],append = False)
1
A | B | C | |
---|---|---|---|
e | 1 | 2 | 3 |
f | 4 | 5 | 6 |
# 元祖的列表建立多层索引
list_tuple = [('e','f'),('g','h')]
df1.set_index(keys = [list_tuple],append = False)
1
2
3
2
3
A | B | C | ||
---|---|---|---|---|
e | f | 1 | 2 | 3 |
g | h | 4 | 5 | 6 |
# 行索引转化为普通列
DataFrame.reset_index(level=None, drop=False, inplace=False, col_level=0, col_fill='')
- level:int 或者行索引的名字,可以为列表,默认包含所有行索引。
- drop:True or False,是否将行索引插入到列中,默认是插入;
- inplace:是否本地修改;
- col_level:如果列索引也是多重的,那么新插入的列设置哪一重索引;
- col_fill:如果有多重索引,除了 col_level 已经设置的
# 单层列索引情况
df1 = df.set_index(['A','C'], drop = True, append = True)
df1
1
2
2
B | |||
---|---|---|---|
A | C | ||
a | 1 | 3 | 2 |
b | 4 | 6 | 5 |
# df1.reset_index(level = 'A', drop = False)
df1.reset_index(level = 1, drop = False) #单 行索引
1
2
2
A | B | ||
---|---|---|---|
C | |||
a | 3 | 1 | 2 |
b | 6 | 4 | 5 |
df1.reset_index(level = [1,2], drop = False) # 行索引的列表
1
A | C | B | |
---|---|---|---|
a | 1 | 3 | 2 |
b | 4 | 6 | 5 |
# 如果所有行索引都恢复为列,那么将生成默认数值索引,如果行索引没有名字,那么生成默认的名字
df1.reset_index(level = [0,1,2], drop = False)
1
2
2
level_0 | A | C | B | |
---|---|---|---|---|
0 | a | 1 | 3 | 2 |
1 | b | 4 | 6 | 5 |
df1.index.set_names(names = 'ab', level = 0, inplace = True)
df1
1
2
2
B | |||
---|---|---|---|
ab | A | C | |
a | 1 | 3 | 2 |
b | 4 | 6 | 5 |
#行索引如果有名字,那么将其设置为列名
df1.reset_index(level = [0,1,2], drop = False)
1
2
2
ab | A | C | B | |
---|---|---|---|---|
0 | a | 1 | 3 | 2 |
1 | b | 4 | 6 | 5 |
df1.reset_index(level = [1,2], drop = True) # drop = True, 直接丢掉选中的行索引,不插入
1
B | |
---|---|
ab | |
a | 2 |
b | 5 |
# 多层列索引情况
df1 = df.copy()
df1.columns = pd.MultiIndex.from_tuples( [('one','A'),('one','B'),('two','C')])
df1
1
2
3
2
3
one | two | ||
---|---|---|---|
A | B | C | |
a | 1 | 2 | 3 |
b | 4 | 5 | 6 |
#多重索引下,如果行索引没有名字,那么变为列之后在列索引的外层生成了默认索引:index。
df1.reset_index(level = 0)
1
2
2
index | one | two | ||
---|---|---|---|---|
A | B | C | ||
0 | a | 1 | 2 | 3 |
1 | b | 4 | 5 | 6 |
#多重索引下,如果行索引有名字,那么变为列之后在列索引的外层索引名作为列名。
df1.index.set_names(['ab'], inplace = True)
df1
1
2
3
2
3
one | two | ||
---|---|---|---|
A | B | C | |
ab | |||
a | 1 | 2 | 3 |
b | 4 | 5 | 6 |
df1.reset_index(level = 0)
1
ab | one | two | ||
---|---|---|---|---|
A | B | C | ||
0 | a | 1 | 2 | 3 |
1 | b | 4 | 5 | 6 |
上次更新: 2023/11/01, 03:11:44