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]: