ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

pandas(7):查询和筛选数据

2021-04-23 11:32:28  阅读:167  来源: 互联网

标签:loc 语文 df 标签 查询 姓名 90 筛选 pandas


目录
数据筛选是处理数据的重要一步。源Excel文件Fancy_Indexing.xlsx:
image

df = pd.read_excel(r'C:/Users/asus/Desktop/Python/Fancy_Indexing.xlsx')
df

image

一、截断操作df.truncate()

df.truncate()需要对索引排序才能截断。

# 数据截断
df.truncate(before=2,after=8)
# 对列索引进行排序才能截断,根据索引值截断,而不是下标
df.sort_index(axis=1).truncate(before='班级',after='语文',axis=1)

image

二、Fancy Indexing

(1)类列表切片[]

# 列操作
df['姓名'] # 选择1列,返回Series
df[['姓名']] # 选择1列,返回DataFrame
df[['姓名','语文']] # 选择多列,返回DataFrame
# 行操作:对下标进行切片,不包含终止位置
df[:] # 全切
df[:3] # 返回前三行
df[4:6] # 返回第5、6行
df[:20:2] # 步长截取
df['数学'][::-1] # 逆序
# 行列同时操作,不可以直接操作
# df[:,['语文']]

(2)基于标签df.loc[]

①单个标签——单行

# 单个标签——单行
df.loc[0] # 0代表是索引值,而不是像列表切片的下标值,字符型索引需要加引号
df.set_index('姓名').loc['任*'] # 字符型索引加引号
# df.set_index('姓名').index.dtype  -->dtype('O')

image

②单个列表标签——多行

# 单个列表标签——多行
df.loc[[0,6,8]]
df.set_index('姓名').loc[['任*','邓*','吴*文']] # 字符型索引加引号
# df.set_index('姓名').loc[[0,6,8]] ->KeyError: 'None of [[0, 6, 8]] are in the [index]'
df.loc[[False, True]*5] # bool数组标签,隔行查找

image
image

③切片标签

# 切片标签,标签也可以切片,且和列表切片不同,包含终止位置
# 根据索引值进行切片,所以先排序才能切,和truncate截断一样
df.loc[:3] # 返回前4行,包含3终止位置
df.set_index('姓名').sort_index().loc['任*':'吴*婕'] # 要先进行排序

image

④逗号双标签

# 逗号双标签——筛选列
# 必须有行元素
df.loc[:,['姓名','语文']] # 行全要,只要‘姓名’‘语文’这两列
df.loc[:10,['姓名','数学']] # 前11行

(3)基于下标位置df.iloc[]

df.iloc[]无论是行选还是列选,都只能用自然索引下标(0-n),不包含终止位置.

df.iloc[2:4,2:3]
df.iloc[:,2:]
df.iloc[[5,2],[4,1]]
df.iloc[5,3] # 返回一个值
# np.r_支持随意筛选,筛选不连续的行或列
df.iloc[np.r_[0,10:15:2,17:19],np.r_[:2,4]]

image

(4)取具体某一数据 .at/.iat

(5)表达式,bool数组

df[df['班级'] == 1] # 筛选1班信息
df[~(df['班级'] == 1)] # 不等
df[df['姓名'] == '马*泰'] # '马*泰'的所有信息
df.loc[df['姓名'] == '马*泰',['姓名','数学']] # 只筛选'马*泰'姓名、数学成绩
df.loc[(df['数学'] > 90) & (df['语文'] >90)] # 且
df.loc[(df['数学'] > 90) | (df['语文'] >90)] # 或
df.loc[df['语文'] > df['英语']] # 列间判断,比较爱国的同学信息
# df.isin()判断
df[df['姓名'].isin(['罗*倩','张*辉'])]

image

三、函数筛选

(1)where 和 mask

df.where(cond, other=nan, inplace=False, 
        axis=None, level=None, errors='raise', 
        try_cast=False, raise_on_error=None)

如果 cond 为真,保持原来的值,否则替换为other,默认为NaN值。mask相反。

df.where(df > 90) # 不大于90分为NaN
df['语文'].where(df['语文'] > 90) # 语文不大于90为NaN
np.where(df > 90,True,False) # 返回Adarray bool数组
# 2 的偶数倍分数显示,否则为相反数
df[['语文','数学']].where(df[['语文','数学']] % 2 == 0,other=-df[['语文','数学']])

image

(2)query()

(3)filter()

标签:loc,语文,df,标签,查询,姓名,90,筛选,pandas
来源: https://www.cnblogs.com/xiaoshun-mjj/p/14692924.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有