Python DataFrame切片、提数据、按条件筛选详解(df[]、loc[]、iloc[]、at[]、iat[])

直接上例子~~~

先导入需要的包,生成一个6行6列的随机df

import numpy as np
import pandas as pd
import random
np.random.seed(5)#设置种子
a=np.random.randint(1,10,(6,6))#生成随机矩阵
col=[chr(i) for i in range(65,71)]#生成大写字母列表
row=[chr(i) for i in range(97,103)]#生成小写字母列表
df=pd.DataFrame(a,columns=col,index=row)
print("df:\n",df)

创建的df:

df:
    A  B  C  D  E  F
a  4  7  7  1  9  5
b  8  1  1  8  2  6
c  8  1  2  5  7  3
d  2  3  8  1  6  1
e  1  5  5  4  3  5
f  7  4  4  3  2  6

1.df[]

df[]一般做单维度提取,按行提取 or 按列提取。注意:按行提取用位置索引,按列提取用标签索引。

#提取行
print("df[0:3]:\n",       df[0:3])
print("df['A']:\n",       df['A']) #单列
print("df[['A','B']]:\n", df[['A','B']]) #多列
print("df['a','b']:\n",   df['a':'b'])

结果

df[0:3]:
    A  B  C  D  E  F
a  4  7  7  1  9  5
b  8  1  1  8  2  6
c  8  1  2  5  7  3
df['A']:
 a    4
b    8
c    8
d    2
e    1
f    7
Name: A, dtype: int32
df[['A','B']]:
a  4  7
b  8  1
c  8  1
d  2  3
e  1  5
f  7  4
df['a','b']:
    A  B  C  D  E  F
a  4  7  7  1  9  5
b  8  1  1  8  2  6

2.iloc[]按位置切片

iloc[参数1,参数2],直接上例子

print("df_iloc1:\n",  df.iloc[0:3])#如果只有一个参数默认取行
print("df_iloc2\n",   df.iloc[0:5,0:5])#指定行和列
print("df_iloc3:\n",  df.iloc[0,0:5])#指定行的某些列
print("df_iloc4:\n",  df.iloc[0:3,0])#指定列的某些行
print("df_iloc5\n",   df.iloc[[0,1],0])#指定列的某些指定行
print("df_iloc6\n",   df.iloc[:,0])#指定列的所有行
print("df_iloc7\n",   df.iloc[0,:])#指定行的所有列
print("df_iloc8\n",   df.iloc[0,0])#指定位置的元素

结果

df_iloc1:
    A  B  C  D  E  F
a  4  7  7  1  9  5
b  8  1  1  8  2  6
c  8  1  2  5  7  3
df_iloc2
    A  B  C  D  E
a  4  7  7  1  9
b  8  1  1  8  2
c  8  1  2  5  7
d  2  3  8  1  6
e  1  5  5  4  3
df_iloc3:
 A    4
B    7
C    7
D    1
E    9
Name: a, dtype: int32
df_iloc4:
 a    4
b    8
c    8
Name: A, dtype: int32
df_iloc5
 a    4
b    8
Name: A, dtype: int32
df_iloc6
 a    4
b    8
c    8
d    2
e    1
f    7
Name: A, dtype: int32
df_iloc7
 A    4
B    7
C    7
D    1
E    9
F    5
Name: a, dtype: int32
df_iloc8
 4

3.loc[]按标签切片

loc[参数1,参数2],直接上例子

print("df_loc1:\n",     df.loc[:,"A"])#取指定列
print("df_loc2:\n",     df.loc["a",:])#取指定行
print("df_loc3:\n",     df.loc[:,["A","B"]])#取指定某些列
print("df_loc4:\n",     df.loc['a':'b',"A"])#取指定列的某些指定行

结果

df_loc1:
 a    4
b    8
c    8
d    2
e    1
f    7
Name: A, dtype: int32
df_loc2:
 A    4
B    7
C    7
D    1
E    9
F    5
Name: a, dtype: int32
df_loc3:
a  4  7
b  8  1
c  8  1
d  2  3
e  1  5
f  7  4
df_loc4:
 a    4
b    8
Name: A, dtype: int32

4.既按标签又按位置

结合使用loc[] 和 iloc[],先用其中一个取出一个维度,再用另一个取

print("df1:\n",     df.loc[:,"A"][0:3])#先按标签提取列,在按位置提取行,同df["A"][0:3]
print("df2:\n",     df.iloc[0]["A"])#先按位置提取行,再按标签提取列,实际为一个数,同df.iloc[0,:]["A"]
print("df3:\n",     df.iloc[:,5]["a"])#df.iloc[:,5]提取的为一列,是Series类型可直接再按标签取,同df.iloc[:,5].lic["a"]
print("df4:\n",     df.iloc[:,0:2].loc["a"])#先按位置,再按标签,df.iloc[:,0:2]是df

结果

df1:
 a    4
b    8
c    8
Name: A, dtype: int32
 A    4
B    7
Name: a, dtype: int32

5.at[],iat[]取单个元素

at[参数1,参数2],按标签取

iat[参数1,参数2],按位置取

print(df.at['a','A'])#标签选取
print(df.iat[0,1])#位置选取

结果

df.at['a','A']:
df.iat[0,1]:
 7

6.按条件切片

# 按条件筛选区域
print("df[df['A']>7]:\n",               df[df["A"]>7])
print("df.loc[df['B']==1,:]:\n",        df.loc[df['B']==1,:])#等同df.loc[df.loc[:,'B']==1,:]、df.loc[df.iloc[:,1]==1,:]
print("df.loc[df.iloc[:,1]==1,:]:\n",   df.loc[df.iloc[:,1]==1,:])
print("df.loc[:,df.loc['a',:]==7]:\n",  df.loc[:,df.loc['a',:]==7])

结果

df[df['A']>7]:
    A  B  C  D  E  F
b  8  1  1  8  2  6
c  8  1  2  5  7  3
df.loc[df['B']==1,:]:
    A  B  C  D  E  F
b  8  1  1  8  2  6
c  8  1  2  5  7  3
df.loc[df.iloc[:,1]==1,:]:
    A  B  C  D  E  F
b  8  1  1  8  2  6
c  8  1  2  5  7  3
df.loc[:,df.loc['a',:]==7]: