饮冰三年-人工智能-Pandas-77-Pandas 数据查询
上一篇:饮冰三年-人工智能-Pandas-74-初始Pandas
数据准备可参考:饮冰三年-人工智能-Django淘宝拾遗-75-数据准备
一、df.loc 方法
def get_data_from_db(): """ 新版本的pandas库中con参数使用sqlalchemy库创建的create_engine对象 创建create_engine对象(格式类似于URL地址): """ engine = create_engine('mysql+pymysql://%s:%s@%s:%s/%s?charset=utf8' % (MYSQL_USER, MYSQL_PASSWORD, MYSQL_HOST, MYSQL_PORT, MYSQL_NAME)) return pd.read_sql("SELECT * FROM tb_score", engine)
# 查看前5行数据 print(df.head()) """ 输出结果 id gender ... add_time modify_time 0 7 0 ... 2022-02-11 17:16:52 2022-02-11 17:16:54 1 8 0 ... 2022-02-11 17:16:52 2022-02-11 17:16:54 2 9 0 ... 2022-02-11 17:16:52 2022-02-11 17:16:54 3 10 1 ... 2022-02-11 17:16:52 2022-02-11 17:16:54 4 11 1 ... 2022-02-11 17:16:52 2022-02-11 17:16:54 """
# 索引默认是数字索引,我么通常可以将主键id设置为索引 df.set_index('id', inplace=True) print(df.index) """ Int64Index([ 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, ... 477, 478, 479, 480, 481, 482, 483, 484, 485, 486], dtype='int64', name='id', length=480) """
1.1 使用单个label值
print("--------1.1 使用单个label值----------") df1 = df.loc[33, 'score_total'] print(df1) # 50
--------1.1 使用单个label值---------- 50
1.2 使用值列表批量查询
print("--------1.2 使用值列表批量查询----------") df2 = df.loc[[33, 34, 35, 36], 'score_total'] print(df2)
--------1.2 使用值列表批量查询---------- id 33 50 34 100 35 80 36 90 Name: score_total, dtype: int64
1.3 使用数值区间进行范围查找
print("--------1.3 使用数值区间进行范围查找(注意:左闭右闭)----------") df3 = df.loc[33:36, 'score_total'] print(df3) df3_1 = df.loc[33:36, 'student_id':'score_total'] print(df3_1)
--------1.3 使用数值区间进行范围查找(注意:左闭右闭)---------- id 33 50 34 100 35 80 36 90 Name: score_total, dtype: int64 student_id student_name exams_version exams_date score_total id 33 203 小花-计 1 2022-02-11 50 34 214 张三-计 1 2022-02-11 100 35 215 李四-计 1 2022-02-11 80 36 216 王五-计 1 2022-02-11 90
1.4 条件表达式查询
print("--------1.4 使用条件表达式查询----------") df4 = df.loc[df['score_total'] > 90, ["profession_name", "course_name", "student_name", "score_total", ]] print(df4) print("--------1.4 使用条件表达式查询(复杂查询)----------") df4_1 = df.loc[ (df['score_total'] > 90) & (df["profession_name"] == '计算机'), ["course_name", "student_name", "score_total", ]] print(df4_1)
--------1.4 使用条件表达式查询---------- profession_name course_name student_name score_total id 10 经济与管理 语文-经 张三-经 100 22 经济与管理 英语-经 张三-经 100 28 经济与管理 经济学-经 张三-经 100 34 计算机 语文-计 张三-计 100 46 计算机 英语-计 张三-计 100 52 计算机 计算机-计 张三-计 100 58 文学与历史 语文-文 张三-文 100 70 文学与历史 英语-文 张三-文 100 76 文学与历史 世界史-文 张三-文 100 82 挖掘机 语文-挖 张三-挖 100 94 挖掘机 英语-挖 张三-挖 100 100 挖掘机 挖掘机实操-挖 张三-挖 100 106 经济与管理 语文-经 张三-经 100 118 经济与管理 英语-经 张三-经 100 124 经济与管理 经济学-经 张三-经 100 130 计算机 语文-计 张三-计 100 142 计算机 英语-计 张三-计 100 。。。。。。
1.5 调用函数查询
print("--------1.5 使用自定义函数查询----------") df5 = df.loc[query_my_data, ["profession_name", "course_name", "student_name", "score_total", ]] print(df5)
--------1.5 使用自定义函数查询---------- profession_name course_name student_name score_total id 10 经济与管理 语文-经 张三-经 100 34 计算机 语文-计 张三-计 100 58 文学与历史 语文-文 张三-文 100 82 挖掘机 语文-挖 张三-挖 100 106 经济与管理 语文-经 张三-经 100 130 计算机 语文-计 张三-计 100
二、df.iloc 方法
和loc一样,按“行”索引出数据,但loc可以按标签索引,iloc和python中list一样是按照索引值。
一个[]是切片出一维Series。
嵌套的[[]]是切割出DataFrame,其中可以混合切割,
iloc是第一个参数是按行,第二是按列,例如df.iloc[[0, 2], [1, 4]]。找出第1行和第3行 的 第2列和第5列,返回的类型是DataFrame。
2.1 使用单个label值
print("--------2.1 使用单个label值----------") df1_i = df.iloc[[33], [0]] print(df1_i)
""" 含义:选择34行的第2列的值 gender 1 """
2.2 使用值列表批量查询
print("--------2.2 使用值列表批量查询----------") df2_i = df.iloc[[33, 34, 35, 36], [1]] print(df2_i)
""" profession_id id 40 2 41 2 42 2 43 2 """
三、df.where 方法
# 三、df.where 方法 如果不符合条件 替换成NaN print("--------3.1 df.where 查询----------") dfw_1 = df.where(df["score_total"] == 100) print(dfw_1)
""" gender profession_id ... add_time modify_time id ... 7 NaN NaN ... NaT NaT 8 NaN NaN ... NaT NaT 9 NaN NaN ... NaT NaT 10 1.0 1.0 ... 2022-02-11 17:16:52 2022-02-11 17:16:54 """
四、df.query 方法
# 四、df.query 方法 如果不符合条件 直接过滤掉 print("--------4.1 df.query 查询----------") dfq_1 = df.query("score_total == 100") print(dfq_1)
""" gender profession_id ... add_time modify_time id ... 10 1 1 ... 2022-02-11 17:16:52 2022-02-11 17:16:54 22 1 1 ... 2022-02-11 17:16:52 2022-02-11 17:16:54 28 1 1 ... 2022-02-11 17:16:52 2022-02-11 17:16:54 34 1 2 ... 2022-02-11 17:16:52 2022-02-11 17:16:54 """