在数据分析和数据建模的过程中需要对数据进行清洗和整理等工作,有时需要对数据增删字段。下面为大家介绍pandas对数据的复杂查询、数据类型转换、数据排序、数据的修改、数据迭代以及函数的使用。
01、复杂查询 实际业务需求往往需要按照一定的条件甚至复杂的组合条件来查询数据,接下来为大家介绍如何发挥pandas数据筛选的无限可能,随心所欲地取用数据。
1、逻辑运算 # q1成绩大于36df.q1> 36# q1成绩不小于60分,并且是c组成员~(df.q1 df.q2] 以下是.loc[ ]和.lic[ ]示例:
# 表达式与切片一致df.loc[df['q1']> 90, 'q1':] # q1大于90,只显示q1df.loc[(df.q1> 80) & (df.q2 90) | (df.q2 90, 'q1':] # q1大于90,显示q1及其后所有列 3、函数筛选 # 查询最大索引的值df.q1[lambdas: max(s.index)] # 值为21# 计算最大值max(df.q1.index)# 99df.q1[df.index==99] 4、比较函数 # 以下相当于 df[df.q1 == 60]df[df.q1.eq(60)]df.ne() # 不等于 !=df.le() # 小于等于 5、查询df.query() df.query('q1 > q2 > 90') # 直接写类型sql where语句 还支持使用@符引入变量
# 支持传入变量,如大于平均分40分的a = df.q1.mean()df.query('q1 > @a+40')df.query('q1 > `q2`+@a') df.eval()与df.query()类似,也可以用于表达式筛选。
# df.eval()用法与df.query类似df[df.eval(q1 > 90 > q3 >10)]df[df.eval(q1 > `q2`+@a)] 6、筛选df.filter() df.filter(items=['q1', 'q2']) # 选择两列df.filter(regex='q', axis=1) # 列名包含q的列df.filter(regex='e$', axis=1) # 以e结尾的列df.filter(regex='1$', axis=0) # 正则,索引名以1结尾df.filter(like='2', axis=0) # 索引中有2的# 索引中以2开头、列名有q的df.filter(regex='^2',axis=0).filter(like='q', axis=1) 7、按数据类型查询
df.select_dtypes(include=['float64']) # 选择float64型数据df.select_dtypes(include='bool')df.select_dtypes(include=['number']) # 只取数字型df.select_dtypes(exclude=['int']) # 排除int类型df.select_dtypes(exclude=['datetime64']) 02、数据类型转换 在开始数据分析前,我们需要为数据分配好合适的类型,这样才能够高效地处理数据。不同的数据类型适用于不同的处理方法。
# 对所有字段指定统一类型df = pd.dataframe(data, dtype='float32')# 对每个字段分别指定df = pd.read_excel(data, dtype={'team':'string', 'q1': 'int32'}) 1、推断类型 # 自动转换合适的数据类型df.infer_objects() # 推断后的dataframedf.infer_objects().dtypes 2、指定类型 # 按大体类型推定m = ['1', 2, 3]s = pd.to_numeric(s) # 转成数字pd.to_datetime(m) # 转成时间pd.to_timedelta(m) # 转成时间差pd.to_datetime(m, errors='coerce') # 错误处理pd.to_numeric(m, errors='ignore')pd.to_numeric(m errors='coerce').fillna(0) # 兜底填充pd.to_datetime(df[['year', 'month', 'day']])# 组合成日期 3、类型转换astype() df.q1.astype('int32').dtypes# dtype('int32')df.astype({'q1': 'int32','q2':'int32'}).dtypes 4、转为时间类型 t = pd.series(['20200801', '20200802']) 03、数据排序 数据排序是指按一定的顺序将数据重新排列,帮助使用者发现数据的变化趋势,同时提供一定的业务线索,还具有对数据纠错、分类等作用。
1、索引排序df.sort_index() s.sort_index() # 升序排列df.sort_index() # df也是按索引进行排序df.team.sort_index()s.sort_index(ascending=false)# 降序排列s.sort_index(inplace=true) # 排序后生效,改变原数据# 索引重新0-(n-1)排,很有用,可以得到它的排序号s.sort_index(ignore_index=true)s.sort_index(na_position='first') # 空值在前,另'last'表示空值在后s.sort_index(level=1) # 如果多层,排一级s.sort_index(level=1, sort_remaining=false) #这层不排# 行索引排序,表头排序df.sort_index(axis=1) # 会把列按列名顺序排列 2、数值排序sort_values() df.q1.sort_values()df.sort_values('q4')df.sort_values(by=['team', 'name'],ascending=[true, false]) 其他方法:
s.sort_values(ascending=false) # 降序s.sort_values(inplace=true) # 修改生效s.sort_values(na_position='first') # 空值在前# df按指定字段排列df.sort_values(by=['team'])df.sort_values('q1')# 按多个字段,先排team,在同team内再看q1df.sort_values(by=['team', 'q1'])# 全降序df.sort_values(by=['team', 'q1'], ascending=false)# 对应指定team升q1降df.sort_values(by=['team', 'q1'],ascending=[true, false])# 索引重新0-(n-1)排df.sort_values('team', ignore_index=true) 3、混合排序 df.set_index('name', inplace=true) # 设置name为索引df.index.names = ['s_name'] # 给索引起名df.sort_values(by=['s_name', 'team']) # 排序 4、按值大小排序nsmallest()和nlargest() s.nsmallest(3) # 最小的3个s.nlargest(3) # 最大的3个# 指定列df.nlargest(3, 'q1')df.nlargest(5, ['q1', 'q2'])df.nsmallest(5, ['q1', 'q2']) 04、添加修改 数据的修改、增加和删除在数据整理过程中时常发生。修改的情况一般是修改错误、格式转换,数据的类型修改等。
1、修改数值 df.iloc[0,0] # 查询值# 'liver'df.iloc[0,0] = 'lily' # 修改值df.iloc[0,0] # 查看结果# 'lily'# 将小于60分的成绩修改为60df[df.q1 = 60, '成绩'] = '合格'df.loc[df.num df.q2)# 比较计算,true为1,false为0df.assign(tag=(df.q1>df.q2).astype(int))# 映射文案df.assign(tag=(df.q1>60).map({true:'及格',false:'不及格'}))# 增加多个df.assign(q8=lambda d: d.q1*5, q9=lambda d: d.q8+1) # q8没有生效,不能直接用df.q8 8、执行表达式df.eval() # 传入求总分表达式df.eval('total = q1+q3+q3+q4') 其他方法:
df['c1'] = df.eval('q2 + q3')df.eval('c2 = q2 + q3') # 计算a = df.q1.mean()df.eval(c3 =`q3`+@a) # 使用变量df.eval(c3 = q2 > (`q3`+@a)) #加一个布尔值df.eval('c4 = name + team', inplace=true) # 立即生效 9、增加行 # 新增索引为100的数据df.loc[100] = ['tom', 'a', 88, 88, 88, 88] 其他方法:
df.loc[101]={'q1':88,'q2':99} # 指定列,无数据列值为nandf.loc[df.shape[0]+1] = {'q1':88,'q2':99} # 自动增加索引df.loc[len(df)+1] = {'q1':88,'q2':99}# 批量操作,可以使用迭代rows = [[1,2],[3,4],[5,6]]for row in rows: df.loc[len(df)] = row 10、追加合并 df = pd.dataframe([[1, 2], [3, 4]],columns=list('ab'))df2 = pd.dataframe([[5, 6], [7, 8]],columns=list('ab'))df.append(df2) 11、删除 # 删除索引为3的数据s.pop(3)# 93ss 12、删除空值 df.dropna() # 一行中有一个缺失值就删除df.dropna(axis='columns') # 只保留全有值的列df.dropna(how='all') # 行或列全没值才删除df.dropna(thresh=2) # 至少有两个空值时才删除df.dropna(inplace=true) # 删除并使替换生效 05、高级过滤 介绍几个非常好用的复杂数据处理的数据过滤输出方法。
1、df.where() # 数值大于70df.where(df > 70) 2、np.where() # 小于60分为不及格np.where(df>=60, '合格', '不合格') 3、df.mask() # 符合条件的为nandf.mask(s > 80) 4、df.lookup() # 行列相同数量,返回一个arraydf.lookup([1,3,4], ['q1','q2','q3']) # array([36, 96, 61])df.lookup([1], ['q1']) # array([36]) 06、数据迭代 1、迭代series # 迭代指定的列for i in df.name: print(i)# 迭代索引和指定的两列for i,n,q in zip(df.index, df.name,df.q1): print(i, n, q) 2、df.iterrows() # 迭代,使用name、q1数据for index, row in df.iterrows(): print(index, row['name'], row.q1) 3、df.itertuples() for row in df.itertuples(): print(row) 4、df.items() # series取前三个for label, ser in df.items(): print(label) print(ser[:3], end='') 5、按列迭代 # 直接对dataframe迭代for column in df: print(column) 07、函数应用 1、pipe() 应用在整个dataframe或series上。
# 对df多重应用多个函数f(g(h(df), arg1=a), arg2=b, arg3=c)# 用pipe可以把它们连接起来(df.pipe(h) .pipe(g, arg1=a) .pipe(f, arg2=b, arg3=c)) 2、apply() 应用在dataframe的行或列中,默认为列。
# 将name全部变为小写df.name.apply(lambda x: x.lower()) 3、applymap() 应用在dataframe的每个元素中。
# 计算数据的长度def mylen(x): return len(str(x))df.applymap(lambda x:mylen(x)) # 应用函数df.applymap(mylen) # 效果同上 4、map() 应用在series或dataframe的一列的每个元素中。
df.team.map({'a':'一班', 'b':'二班','c':'三班', 'd':'四班',})# 枚举替换df['name'].map(f) 5、agg() # 每列的最大值df.agg('max')# 将所有列聚合产生sum和min两行df.agg(['sum', 'min'])# 序列多个聚合df.agg({'q1' : ['sum', 'min'], 'q2' : ['min','max']})# 分组后聚合df.groupby('team').agg('max')df.q1.agg(['sum', 'mean']) 6、transform() df.transform(lambda x: x*2) # 应用匿名函数df.transform([np.sqrt, np.exp]) # 调用多个函数 7、copy() s = pd.series([1, 2], index=[a,b])s_1 = ss_copy = s.copy()s_1 is s # trues_copy is s # false
线性稳压电源和开关稳压电源详解
Windows CE 6.0 Multi-bin的设计与实现
智能魔镜,让你如同生活在童话世界一般
为什么要担心栅极驱动器的电源?
关于一些手机信号放大器安装的常见问题
Pandas 50个高级、高频操作
飞腾软件产品兼容性互认证的申请步骤
聚星仪器隔空把脉 实时监测桥梁健康状况
洲明首块超高清8K+3D显示屏正式点亮
油井自动化控制系统的连接点
MediaTek天玑9000+旗舰5G移动平台的技术优势
搜狗发布4款新品 未来或将引领着整个录音笔行业走向AI时代
离线电源的理想选择UC3845
EDA工具的应用场景应该不仅仅局限于IC设计
通过集成工业接口数字隔离器减小尺寸和成本
瞄准超低功耗IoT GF拥抱FD-SOI制程
调速电机整改案例分享
微软雪藏Surface Pro5,准备蓄势待发!
PCBA加工中都会遇到哪些常见的不良现象?
微信之父张小龙4小时历史最长演讲火热出炉!