本文介绍了在Python的数据处理库Pandas中如何灵活运用各种方法来实现DataFrame对象的列与索引之间的相互转换,帮助读者掌握数据重塑的关键技术。
### Pandas之DataFrame对象的列和索引之间的转化
在数据处理过程中,Pandas库的DataFrame对象是非常重要的工具之一。为了更好地操作数据,有时我们需要改变DataFrame的结构,比如将列转换为索引或将索引转换为列。这些操作可以通过`set_index()`和`reset_index()`方法来实现。
#### 一、列转化为索引
将DataFrame中的某一列或几列设置为索引,可以方便地进行分组等操作。
##### 单列作为索引
```python
df1 = pd.DataFrame({
X: range(5),
Y: range(5),
S: [a, a, b, b, b],
Z: [1, 1, 2, 2, 2]
})
# 使用set_index()将S列设为索引
df1.set_index(S)
```
**输出:**
```
X Y Z
S
a 0 0 1
a 1 1 1
b 2 2 # 索引为 b 的行有两个,值分别为 (X=3, Y=3) 和 (X=4, Y=4)
b b # 这里应该是重复的索引展示错误,正确的输出是:
# X Y
S Z
a 1 0 0
a 1 1 1
b 2 2 # 索引为 b 的行有两个,值分别为 (X=3, Y=3) 和 (X=4, Y=4)
```
可以看到,S列被移除,并转换成了索引。
##### 多列作为索引
如果需要将多列设置为多级索引,可以传递一个包含列名的列表:
```python
df1.set_index([S, Z])
```
**输出:**
```
X Y
S Z
a 1 0 0
a 1 1 1
b 2 2 # 索引为 b 的行有两个,值分别为 (X=3, Y=3) 和 (X=4, Y=4)
```
这里S和Z列都被移除了,并且形成了一个多级索引。
##### 保持原始列
默认情况下,`set_index()`会删除用作索引的列。如果希望保留这些列,可以设置参数`drop=False`:
```python
df1.set_index([S, Z], drop=False)
```
**输出:**
```
X Y S Z
S Z
a 1 0 0 a 1
a 1 1 1 a 1
b 2 2 # 索引为 b 的行有两个,值分别为 (X=3, Y=3) 和 (X=4, Y=4)
```
#### 二、索引转化为列
如果之前已经将某些列设置为索引,那么可能还需要将这些索引转换回列。
##### 创建带有索引的DataFrame
我们创建一个带有多级索引的DataFrame:
```python
df2 = df1.set_index([S, Z])
```
**输出:**
```
X Y
S Z
a 1 0 0
a 1 1 1
b 2 # 索引为 b 的行有两个,值分别为 (X=3, Y=3) 和 (X=4, Y=4)
```
##### 将单个索引转换为列
如果只需要将其中的一个索引转换为列,可以指定索引名称:
```python
df2.reset_index(Z)
```
**输出:**
```
Z X Y S
S
a 1 0 0 a
a 1 1 1 a
b # 索引为 b 的行有两个,值分别为 (X=3, Y=3) 和 (X=4, Y=4)
```
这里Z索引被转换为了列。
##### 将所有索引转换为列
如果需要将所有的索引都转换为列,可以不指定索引名称:
```python
df2.reset_index()
```
**输出:**
```
S Z X Y
0 a 1 0 0
1 a 1 1 1
2 # 索引为 b 的行有两个,值分别为 (X=3, Y=3) 和 (X=4, Y=4)
```
这将所有的索引都转换为了列