前言
python里的东西都太过灵活,这篇文章是为了梳理一下DataFrame的提取行列操作。先定义以下DataFrame,df.
import pandas as pd
import numpy as np
df = pd.DataFrame(np.arange(12).reshape(3,4),columns=list('ABCD'))
print(df)
结果:
A B C D
0 0 1 2 3
1 4 5 6 7
2 8 9 10 11
df2 = pd.DataFrame(np.arange(12).reshape(3,4),columns=list('ABCD'),index=['Jerry','John','Sam'])
print(df2)
结果:
A B C D
Jerry 0 1 2 3
John 4 5 6 7
Sam 8 9 10 11
处理,提取行和列
df[]
中括号既可以用来提取行,也可以用来提取列,区分两种方式的用法十分重要。
如果是默认index(第一行从0开始),那么用df[]基本无法处理行
df[]处理列
自定义索引、list、结合df.columns,Callable对象
1. 用自定义索引(列名)提取单列
df['A']
结果:
0 0
1 4
2 8
Name: A, dtype: int32
df2['A']
结果:
Jerry 0
John 4
Sam 8
Name: A, dtype: int32
2. 用list提取多列
df[['A','C']]
结果:
A | C | |
---|---|---|
0 | 0 | 2 |
1 | 4 | 6 |
2 | 8 | 10 |
df2[['A','C']]
结果:
A | C | |
---|---|---|
Jerry | 0 | 2 |
John | 4 | 6 |
Sam | 8 | 10 |
3. 结合df.columns用列序号提取单列/多列
- df.columns[0]是用来选取自定义索引(列名)的(上文1.)
- df.columns[[0,2]]是用来选取列名的list的(上文2.)
df[df.columns[0]]
结果:
0 0
1 4
2 8
Name: A, dtype: int32
df2[df.columns[0]]
结果:
Jerry 0
John 4
Sam 8
Name: A, dtype: int32
df[df.columns[[0,2]]] # 结合df.columns用列序号提取多列
结果:
A | C | |
---|---|---|
0 | 0 | 2 |
1 | 4 | 6 |
2 | 8 | 10 |
df2[df.columns[[0,2]]]
结果:
A | C | |
---|---|---|
Jerry | 0 | 2 |
John | 4 | 6 |
Sam | 8 | 10 |
df[df.columns[0:3]] # 结合df.columns用列序号提取多列
结果:
A | B | C | |
---|---|---|---|
0 | 0 | 1 | 2 |
1 | 4 | 5 | 6 |
2 | 8 | 9 | 10 |
df2[df.columns[0:3]]
结果:
A | B | C | |
---|---|---|---|
Jerry | 0 | 1 | 2 |
John | 4 | 5 | 6 |
Sam | 8 | 9 | 10 |
4. callable对象
各种函数(少不了我们的lambda)
df[lambda x: df.columns[3]]
结果:
0 3
1 7
2 11
Name: D, dtype: int32
def chooseCol(x):
return df.columns[x]
df[chooseCol(1)]
结果:
0 1
1 5
2 9
Name: B, dtype: int32
df[]处理行
默认索引,自定义索引,bool数组
1. 默认索引
df[:1]
结果:
A | B | C | D | |
---|---|---|---|---|
0 | 0 | 1 | 2 | 3 |
df2[:1]
结果:
A | B | C | D | |
---|---|---|---|---|
Jerry | 0 | 1 | 2 | 3 |
2. 自定义索引
df[0:2] # 只要行索引是int型就无法使用自定义索引,原因应该是无法识别字符串和int,大家也可以试一试将index换成[1,2,3]看看效果如何
结果:
A | B | C | D | |
---|---|---|---|---|
0 | 0 | 1 | 2 | 3 |
1 | 4 | 5 | 6 | 7 |
df2['Jerry':'Sam'] # 注意自定义索引左右都是闭区间,所以Jerry行和Sam行都被选中了
结果:
A | B | C | D | |
---|---|---|---|---|
Jerry | 0 | 1 | 2 | 3 |
John | 4 | 5 | 6 | 7 |
Sam | 8 | 9 | 10 | 11 |
3. bool数组
df[[True,False,True]] # 选了True的才会被选中
结果:
A | B | C | D | |
---|---|---|---|---|
0 | 0 | 1 | 2 | 3 |
2 | 8 | 9 | 10 | 11 |
df[df.duplicated()] # df.duplicated()返回的是bool数组,如果行有重复,默认返回第一项为True,其余为False;如果行没重复,返回的就是False。
结果:
A | B | C | D |
---|
修改行和列的名称
df.rename()
比较重要的参数:mapper, index, columns, axis, inplace.
- mapper = 字典,将要替换的行名或列名传入字典
- index = mapper 等价于 mapper, axis = 0
- columns = mapper 等价于 mapper, axis = 1
- axis = 0代表行,axis=1代表列
- inplace = True就是直接更改,返回None;inplace = False就会返回一个更改过的数组
df.rename({
'A':'a'} ,axis = 1,inplace=True)
print(df)
print(df.rename(mapper = {
'a':'A'} ,axis = 1))
print(df.rename(columns={
'B':'bbbb'}))
print(df.rename(index={
0:'aaa'}))