DataFrame查询数据操作
目录
准备数据
import pandas as pd
df = pd.read_csv('../data/a_scientists.csv')
df
获取df一列或多列数据
从前后获取多行数据
-
df.head([n]) 返回前n行数据, 默认返回前5行
-
df.tail([n]) 返回后n行数据, 默认返回后5行
# 获取前5行
print(df.head())
print('-----------------------')
# 获取前10行
print(df.head(10))
# 获取最后5行
print(df.tail())
print('-----------------------')
# 获取最后10行
print(df.tail(10))
获取一列数据
获取一列数据, 通过df[列名]
或df.列名
, 返回series对象
注意:如果列名字中间有空格, 只能通过df['列名']方式获取, 并且英文注意要与列名一致,大小写保持一致
# 获取姓名列 方式一
print(df['Name'])
print('---------------------------------')
# 获取姓名列 方式二
print(df.Name)
获取多行数据
获取多列数据, 通过
df[[列名1, 列名2, ...]]
, 返回dataframe对象
注意: 是两层[], 可以理解为df[列名的列表]
# 获取'Name','Born','Age'
new_df = df[['Name','Born','Age']]
print(new_df)
print('---------------------------------')
# 查看类型
print(type(new_df))
布尔值向量获取行数据
-
布尔值向量:完全由布尔值组成的一维数据,布尔值向量形式为
-
布尔值构成的列表
-
布尔值构成的numpy.narray
-
布尔值构成的series
-
-
df[[布尔值向量]]
其中布尔值向量
的布尔值个数必须和df的行数(df.shape[0]
)相等
准备数据
import pandas as pd
# 加载数据
df = pd.read_csv('../data/b_LJdata.csv')
df
1)获取第2行和第5行,注意索引是从0开始
# 获取前5行
df_head = df.head()
# 布尔值列表获取对应为True的行数据 获取第2行和第5行
df_head[[False, True, False, False, True]]
2)获取第1行和第4行
# 布尔值构成的ndarray获取对应为True的行数据 获取第1行和第4行
import numpy as np
arr = np.array([True, False, False, True, False])
df_head[arr]
3)获取面积>80的行数据
# 布尔值构成的Series获取对应为True的行数据 获取面积>80
df_head[df_head['面积']>80]
索引下标切片获取行数据
通过
df[起始行下标:结束行下标:步长]
, 获取多行数据
遵循 左闭右开原则(包含起始行, 不包含结束行), 步长默认为1
1)获取索引是偶数行数据
# 获取前10行数据
df_head = df.head(10)
df_head
# 从前10行中 获取索引为 偶数
df_head[::2]
2)获取索引为奇数的行数据
# 从前10行中 获取索引为 奇数
df_head[1::2]
3)获取第2行到第9行且布长为3
# 从前10行中 获取第2行到第9行步长为3
df_head[1:8:3]
loc通过行列名获取子集
df.loc[]
通过行名(行索引值、行索引名)、列名获取子集
行索引值获取1行数据
通过
df.loc[行索引值]
获取一行数据
# 获取行索引值为2的一行数据, 返回series
print(df.loc[2])
行索引获取多行数据
通过
df.loc[[行索引值1, 行索引值2, ...]]
获取多行数据
# 获取行索引值为0和2的两行数据, 返回dataframe
print(df.loc[[0, 2]])
行索引值切片获取多行数据
通过
df.loc[起始行索引值:结束行索引值:步长]
获取多行数据
遵循 左闭右闭原则(包含起始行, 包含结束行), 步长默认为1
注意:df.loc[起始行索引值:结束行索引值:步长]
不等同于df[起始行下标:结束行下标:步长]
print(df.loc[:3]) # 表示获取行索引值0到3的行数据
print(df[:3]) # 表示获取行下标值0到2的行数据
布尔值向量获取行数据
通过df.loc[[布尔值向量]]
获取对应为True的行数据, 等同于df[[布尔值向量]]
# 获取第2行和第5行的行数据
df_head = df.head()
n1 = np.array([False, True, False, False, True])
print(df_head.loc[n1])
布尔值向量取行再配合列名取子集
通过
df.loc[布尔值向量, [列名1, 列名2, ...]]
获取子集
df = df.head() # 只取前5行数据
# print(df['区域'] == '望京租房') # 返回布尔值的series
print(df.loc[df['区域'] == '望京租房'])
print(df.loc[df['区域'] == '望京租房', ['区域', '价格']])
行索引取行再配合列名取子集
通过
df.loc[[行索引值1, 行索引值2, ...], [列名1, 列名2, ...]]
print(df.loc[1])
print("======================")
print(df.loc[[1], ['区域', '价格']])
行索引值切片取行再配合列名取子集
通过
df.loc[行索引值起始值:行索引值结束值:步长, [列名1, 列名2, ...]]
获取子集
遵循 左闭右闭原则(包含起始行, 包含结束行), 步长默认为1
print(df.loc[1:5:2, ['区域', '价格']])
print(df.loc[:, ['区域', '价格']])
iloc通过行列下标获取子集
df.iloc[]
通过行下标(行索引下标、行序号)、列下标获取子集
行下标获取1行数据
通过
df.iloc[行下标]
获取一行数据
# 获取行索引下标为2的一行数据, 返回series
print(df.iloc[2])
行下标获取多行数据
通过
df.iloc[[行下标1, 行下标2, ...]]
获取多行数据
# 获取行索引下标为0和2的两行数据, 返回dataframe
print(df.iloc[[0, 2]])
行下标切片获取多行子集
通过
df.iloc[起始行下标:结束行下标:步长]
获取多行数据
遵循 左闭右开原则(包含起始行, 不包含结束行), 步长默认为1
注意:df.iloc[起始行下标:结束行下标:步长]
等同于df[起始行下标:结束行下标:步长]
print(df.iloc[:3]) # 表示获取行下标为0到2的行数据
print(("==================="))
print(df[:3]) # 表示获取行下标为0到2的行数据
行列下标切片去子集
通过
df.iloc[起始行下标:结束行下标:步长, 起始列下标:结束列下标:步长]
获取子集
遵循 左闭右开原则(包含起始行/列, 不包含结束行/列), 步长默认为1
# 第1行到第5行,每2行选第1行;所有列,每2列取第1列
print(df.iloc[0:5:2, ::2])
行下标切片和行下标取子集
通过
df.iloc[起始行下标:结束行下标:步长, [列下标1, 列下标2, ...]]
获取子集
遵循 左闭右开原则(包含起始行, 不包含结束行), 步长默认为1
# 第1行到第5行,每2行选第1行;第1列和第3列
print(df.iloc[0:5:2, [0, 2]])
行下标和列下表标子集
通过
df.iloc[[行下标1, 行下标2, ...], [列下标1, 列下标2, ...]]
# 第1行、第3行、第5行;第1列和第3列
print(df.iloc[[0, 2, 4], [0, 2]])
行下标和列下标切片取子集
通过
df.iloc[[行下标1, 行下标2, ...], 起始列下标:结束列下标:步长]
获取子集
遵循 左闭右开原则(包含起始列, 不包含结束列), 步长默认为1
# 第1行、第3行、第5行;所有列,每2列取第1列
print(df.iloc[[0, 2, 4], ::2])
query函数获取子集
通过df.query(判断表达式)
获取符合条件的df子集, 与df[[布尔值向量]]
效果相同
注意:判断表达式为字符串格式
判断一个条件
print(df.query('区域=="望京租房"'))
判断多个条件
print(df.query('区域 in ["望京租房", "天通苑租房", "回龙观租房"]').query('朝向 in ["东", "南"]'))
print(df.query('(区域 in ["望京租房", "天通苑租房", "回龙观租房"]) and (朝向 in ["东", "南"])'))
isin函数获取子集
通过
df.isin(values=[值1, 值2, ...])
判断df中的数据值是否在values列表值中, 返回由布尔值构成的新df
原df中数据值在values列表中返回True, 否则返回False
temp_df = df.head(5)
print(temp_df.isin(values=['天通苑租房']))
print(temp_df.isin(values=['天通苑租房', '南']))
print(temp_df[temp_df.isin(values=['天通苑租房', '南'])])
print(temp_df[((temp_df["区域"]=='望京租房') | (temp_df['区域']=='天通苑租房') | (temp_df['区域']=='回龙观租房')) & ((temp_df['朝向']=='东') | (temp_df['朝向']=='南'))])
Serires对象使用isin函数返回新的s对象,其他完全相同
print(temp_df['区域'].isin(values=['天通苑租房']))
print(temp_df['区域'].isin(values=['天通苑租房', '回龙观租房']))
print(temp_df[temp_df['区域'].isin(values=['天通苑租房', '回龙观租房'])])
loc和iloc的区别
- loc
- loc是根据行列名获取子集,行列名是肉眼看到的值
- 通过
df.loc[行索引值起始值:行索引值结束值:步长, [列名1, 列名2, ...]]
获取子集 - 遵循左闭右闭原则(包含起始行, 包含结束行), 步长默认为1
- iloc
- iloc是根据行列下标获取子集,行列下标是从0开始,自增的整数
- 通过
df.iloc[起始行下标:结束行下标:步长]
获取多行数据 - 遵循左闭右开原则(包含起始行, 不包含结束行), 步长默认为1
原文地址:https://blog.csdn.net/weixin_58305115/article/details/142953548
免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!