




















1、显式访问:在pandas对象中可以使用标签形式访问数据(可读性高,面向业务端更友好);显式访问loc[],方括号内接收的是标签;这里loc并不是函数(方法),可以理解为pandas提供的一种访问机制。
s.loc[labels]
df.loc[labels]
labels:标签名,标签名列表,BOOL列表(没有标签的,有标签的,也包括条件表达式),切片(可以序号索引切片,也可以标签切片,但标签切片与序号索引切片不同的是左右端头元素都包含的)
import numpy as np import pandas as pd arr = np.random.randint(0, 100, size=(5, 6)) # 二维数据 df = pd.DataFrame(data=arr, columns=list("ABCDEF")) print(df) # 访问某个元素 # 显式访问某个元素 print(df.loc[2, "C"]) # 行标签为2,列标签为C的元素 # 隐式访问某个元素 print(df.iloc[2, 2]) # 位于行3列3的元素 # 访问某几行/列 # 显式访问某一行/列 print(df.loc[3]) # 访问行索引为3的行 # 访问前两行 print(df.loc[[0,1]]) # 访问列标签为B的列,因为访问B列,所以B列对应各行访问是全访问,通过: 表示全访问 print(df.loc[:,["B"]]) # 访问列标签为B的列,也可以如下明确写为0:4 print(df.loc[0:4,["B"]]) # 访问列标签为B的列,因为访问的就一列,所以可以去除方括号[] print(df.loc[:,"B"]) # 切片方式访问某几行某几列 # 访问行1到2,列B到E(行列两端都包含) print(df.loc[1:2,"B":"E"]) # 索引列表方式访问,通过[]设置行、列分别要访问的具体行/列索引列表 print(df.loc[[1,3], ["A", "C", "D"]]) # 访问第1、3行对应ACD列的数据 # 通过布尔值访问方式 # 就是把整个对象中要访问的元素标签设置为True,不访问的设置为Fales # 布尔值方式访问前两行 print(df.loc[[True, True, False, False, False]]) # 布尔值方式访问1、3行对应的CF列 print(df.loc[[False, True, False, True, False], [False, False, True, False, False, True]])
2、隐式访问:也可以使用数字序号index的形式访问数据;隐式访问iloc[],方括号内接收的是序号索引。
隐式访问除了是序号索引之外基本与显式访问类似,其中要注意的是切片是左闭右开,而显式索引的切片是两端闭合(都包含)。
3、这里不论是series还是dataframe,都可以使用loc和iloc
4、字典访问:把dataframe当成字典,列索引就是字典的键
# 字典访问 df = pd.DataFrame(data=np.random.randint(0, 50, size=(3, 4)), index=list("XYZ"), columns=list("ABCD")) print(df) print(df["A"]) # 访问列标签为A的列 print(df[["B", "D"]]) # 访问列标签为BD的列 print(df["C"]["X"]) # 访问行标签为X的行,列标签为C的元素
5、where() 和 mask()
where:满足con条件的保留,其他用other填充;
mask:不满足con条件的保留,其他用other填充;
# 匹配各个元素的条件判断 condition = df > 50 print(condition, type(condition)) # 此时condition是一个DataFrame对象 print(df[condition]) # 这样打印出来的结果就是符合条件的元素,不符合的用NaN填充了 # 如果想用特定的值填充,可以如下 print(df[condition].fillna(200)) # 用where()方法 new_df = df.where(condition) # 默认用NaN填充 print(new_df) new_df = df.where(condition, "C") # 用C填充 print(new_df) # 行筛选的条件判断 print(df) condition = df["A"] > 60 # 筛选列标签为A的列中大于60的布尔值列表 print(condition) print(type(condition)) # 此时condition是一个Series对象,该对象的布尔值对应了A列中各行元素是否满足条件 print(df[condition]) # 筛选出符合condition条件的行 # 用where()方法 new_df = df.where(condition) # 默认用NaN填充 print(new_df) new_df = df.where(condition, "ABC") # 用ABC填充 print(new_df)
mask()的用法与where()类似,只是条件相反。
6、query()方法
df = pd.DataFrame(data=np.random.randint(0,100,size=(5,4)), columns=list("ABCD")) print(df) # 找出A列大于60的行 print(df.query("A > 60")) # 找出A列大于20且B列也大于20的行 print(df.query("A > 20 and B > 20")) df.loc[1,"B"] = 36 print(df) # 找出B列中等于36的行 print(df.query("B == 36"))
7、filter()方法
可以用来对行名和列名进行筛选
# 使用filter()方法:只用来筛选行名或列名 df_data = np.random.randint(0,100,size=(5,7)) df_index = ["A1", "A2", "B1", "C1", "C2"] df_columns = ["X1", "Y1", "Y2", "Y3", "Y4", "Z1", "Z2"] df = pd.DataFrame(df_data,df_index,df_columns) print(df) # 筛选A1,C2行 print(df.filter(items=["A1", "C2"], axis=0)) print("按之前学过的知识,还可以如下使用loc[]:") print(df.loc[["A1", "C2"]]) # 筛选列标签中包含Y的列 print(df.filter(regex="Y", axis=1))
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。