自学内容网 自学内容网

DataFrame查询数据操作

目录

准备数据

获取df一列或多列数据

从前后获取多行数据

获取一列数据

获取多行数据

布尔值向量获取行数据

索引下标切片获取行数据

loc通过行列名获取子集

行索引值获取1行数据

行索引获取多行数据

行索引值切片获取多行数据

布尔值向量获取行数据

布尔值向量取行再配合列名取子集

行索引取行再配合列名取子集

行索引值切片取行再配合列名取子集

iloc通过行列下标获取子集

 行下标获取1行数据

行下标获取多行数据

行下标切片获取多行子集

行列下标切片去子集

行下标切片和行下标取子集

行下标和列下表标子集

行下标和列下标切片取子集

query函数获取子集

判断一个条件

判断多个条件

isin函数获取子集

loc和iloc的区别


准备数据

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)!