清晰明了的DataFrame行列处理

前言

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用列序号提取单列/多列
  1. df.columns[0]是用来选取自定义索引(列名)的(上文1.)
  2. 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.

  1. mapper = 字典,将要替换的行名或列名传入字典
  2. index = mapper 等价于 mapper, axis = 0
  3. columns = mapper 等价于 mapper, axis = 1
  4. axis = 0代表行,axis=1代表列
  5. 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'}))

猜你喜欢

转载自blog.csdn.net/skywuuu/article/details/112761973