前言

在算法开发的工作中,很大一部分工作是进行数据分析。我们需要分析原始数据分布、算法效果回收等。这样的数据大部分都是结构化的数据,在Python中常用的处理结构化数据的工具包为Pandas、Numpy。本文将汇总的Python中处理DataFrame数据的一些常用操作进行介绍。

数据

为了方便大家,这里将脱敏后的数据提供出来:

链接:https://pan.baidu.com/s/1-uUOZfVHohfJU9JNRO2opA

提取码: gckq

一段注释比代码多的代码

这里将处理DataFrame数据时一些常用的操作以代码的形式进行演示,包含了一些函数的基本用法。

import pandas as pdimport numpy as npdf = pd.read_csv('gzh.csv',encoding='utf8',sep='\t',usecols=['team_name','phone','num','rate1','rate2']) #默认第一行是表头

#查看df的维度print(df.shape)#查看表数据的基础信息print(df.info())#查看每一列数据的格式print(df.dtypes)#验证空值print(df.isnull())#验证nan值print(df.isna())#注意:上述结果看来isnnull()和isnan()的结果是一样的,后面会讲两者的不同#查看数据表的值print(df.values)print(type(df.values))#数据类型为:numpy.ndarray#查看列名称print(df.columns)#查看前、后n行数据print(df.head(6))print(df.tail(6))  #默认前、后10行#空值填充print('111111')print(df.fillna(value=0))#使用rate2的均值对rate2的NaN进行填充print(df['rate2'].fillna(df['rate2'].mean()))#对不同的列的NaN分别进行填充

#遍历DataFrame的每一行#方法1:for index, row in df.iterrows(): print('index:',index) # 输出每行的索引值 print('row2:',row['team_name']) break#df.iterrows()返回的是一个元组:(index,data)

#方法2:for row in df.itertuples(): print('方法2:') print(getattr(row, 'team_name'), getattr(row, 'num')) # 输出每一行 break

#遍历DataFrame的每一列for index, row in df.iteritems(): print(index) # 输出列名 print(row) break

#更改列名print(df.rename(columns={'rate1':'rate'}))#去重print(df['team_name'].drop_duplicates(keep='first'))#--得到该列的去重结果,keep参数默认first,keep='last'表示保留最后一个print(df.drop_duplicates(subset=['team_name'],keep='first'))#--整个表按照team_name列去重

#数据替换print(df['team_name'].replace('东大区','成东大区')) #返回的是只有team_name列df.loc[df['team_name']=='东大区','team_name'] = '成东大区'print(df)#返回变换后的整个DataFrame

#数据合并:merge、append、join、concat、多表合并'''merge:    参数说明:        1.left:链接的左表        2.right:链接的右表        3.how:'inner''outer''left''right',默认是'inner'        4.on:用于链接的列名。同时存在于左右两个表中的列名。不指定就默认是两者的列明交集        5.left_on:左表用于链接的列        6.left_on:右表...        7.

'''df1=df.drop_duplicates(subset=['team_name'],keep='first')df2 = pd.read_csv('gzh.csv',encoding='utf8',sep='\t',usecols=['team_name','rate3','rate4','rate5','rate6']) #默认第一行是表头df2=df2.drop_duplicates(subset=['team_name'],keep='first')print('**************')

print(df1)print(df2)

#对df1和df2进行链接操作-mergedf_in=pd.merge(df1,df2,how='inner',on='team_name')df_le=pd.merge(df1,df2,how='left',left_on='team_name',right_on='team_name')df_ri=pd.merge(df1,df2,how='right',on='team_name')df_ou=pd.merge(df1,df2,how='outer',left_on='team_name',right_on='team_name')print(df_in)#设置索引df1.set_index(['team_name'])df2.set_index(['team_name'])

#对df1和df2进行链接操作-joindf1.merge(df2,left_index=True,right_index=True,how='outer')#上一行等价于:#df1.join(df2,how='outer')#这个地方会报错,因为df1和df2的index的列名一样。join做不到想merge一样智能#注:join方法是merge的简化版,它省略了参数,但是join不能做基于列的表链接

#concat#该方法相当于数据库中的全连接(UNION ALL),可以指定按照哪个列继续宁链接,并且可以指定链接方式(outer、inner),concat链接后不会去重'''pd.concat(object,axis=0,join='outer',join_axes=None,ignore_index=False,keys=None,levels=None,names=None,verify_integrity=False)    1.object:series,dataframe    2.axis=0:从行方向上进行链接(变长),默认axis=0;axis=1:从列方向上进行链接(变宽)    3.join:inner或者outer'''

#append#可以appende的数据类型:DataFrame、series、dict、listadd_data={'team_name':'电子科大区','phone':'132****7928','num':3,'rate1':100.0,'rates':100}add_df=df.append(add_data,ignore_index=True)#append的数据为字典时,必须设置ignore_index=Trueserise=pd.Series(add_data,name="a")#必须得带上name=这个参数,不然报错。#注:append的数据类型为Series类型时,name=参数要加,但是ignore_index是木有的。add=df.append(serise)print('append:')print(add_df)print(add)add_list=[['回龙观区','132****7992','3',100,100]]df_list=df.append(add_list)#如果一维的[],则append时,时按列append的。要按行append,需要是二维的。print('df_list:')print(df_list)#上述方法都是左右两个表的链接,多个表的链接?可用下面的方法:from functools import reduce#dfs=[table1_pd, table2_pd, table3_pd, table4_pd, table5_pd, table6_pd, table7_pd]dfs=[df1,df2]df_final = reduce(lambda left, right: pd.merge(left, right, how='left', on='team_name'), dfs)

#根据某写条件给DataFrame加一列df['level']=np.where(df['num']>2,'YES','NO')print(df)

#对符合条件的行进行标记df.loc[(df['team_name']=='海鹰区') & (df['num']>2),'flag']=1print('here:')print(df)#注:两个条件要加上(),不然报错

#splitdf['start']=pd.DataFrame((x.split('****') for x in df['phone']),columns=['start','end'])['start']df['end']=pd.DataFrame((x.split('****') for x in df['phone']),columns=['start','end'])['end']print(df)#上述也可以用merge来实现split之后的DataFrame与df合并

#截取DataFrame的子数据集print(df.loc[2])  #根据索引,截取单行数据

print(df.iloc[2:4])  #根据索引,截取多行数据,左闭右开print('qqqqqqqq')print(df.loc[2:4]) #根据索引,截取多行数据,左闭右闭print(df.iloc[[0,1,2],[0,1]]) #利用iloc截取固定行列的数据,这个操作loc就做不到了print(df.iloc[0:2,0:1]) #利用iloc获得区域行列的数据,loc实现不了#多值判断用[],isin一个listdflis=df.loc[df['team_name'].isin(['成东大区','红西区'])]#上述可以用另外一种方法实现:dfquery=df.query('team_name==["成东大区","红西区"]')#也可以这样:dfdf=df[(df['team_name']=='成东大区') | (df['team_name']=='红西区')]print(dfquery)print(dflis)print(dfdf)

#提取部分字符串df['str_start']=pd.DataFrame(df['phone'].str[:3])print(df)

#根据条件筛选某(些)列dfs=df.loc[(df['team_name']=='红西区') & (df['phone'].str.startswith('15')),['team_name','phone']]print(dfs)

#计数统计#将team_name列进行counttn_count=df[(df['team_name']=='成东大区') | (df['team_name']=='红西区')].team_name.count()print(tn_count)num_sum=df.loc[df['team_name'].isin(['成东大区','红西区'])].num.sum()print(num_sum)

#分组及统计print(df.groupby('team_name').count())#根据team_name来分组,对各列进行计数print(df.groupby('team_name').rate1.count())#根据team_name分组,对rate1来计数print(df.groupby('team_name')['rate1'].count())#根据team_name分组,对rate1来计数

#对某一列计算应用多个函数print(df.groupby('team_name')['rate1'].agg([len,np.sum,np.mean]))#这里的len求得是分组后的count'''#agg函数和apply函数区别 1.agg用来做聚合运算:将一维数组转化成标量 2.apply是更一般化的函数,它不存在将数据简化的逻辑 3.两者都是基于groupby运用运用的 4.agg传入的是分组后的一列,返回一个标量;apply传入的是分组后的全部数据,返回多维数据。'''#agg的用法:#用法1:对一列用2个函数df.groupby('team_name').agg(['mean','max'])#用法2:对不同的列所用不同的聚合函数df.groupby('team_name').agg({'num':['mean'],                             'rate1':['max']})

#map(),apply(),applymap()的区别''' 1.map():是一个Series函数,DataFrame中没有map(),map()将一个自定义函数应用于Series结构中的每个元素. 2.apply():将一个函数作用于DataFrame中的每个行或者列 3.applymap():将函数做用于DataFrame中的所有元素'''df['phone'] = df['phone'].map(lambda x : x+'-A')#map作用于Series的每一个元素df['change'] = df['num'].map({3:5,0:"null"})df['sum'] = df[['rate1','rate2']].apply(lambda x : x.sum(),axis=1 )#对df[['rate1','rate2']]这个DataFrame的每一行/列应用函数。axis=1:对每一行应用函数;axis=0:对每一列应用函数df.loc['total'] = df[['rate1','rate2']].apply(lambda x : x.sum(),axis=0 )#对列应用函数时df.locdf=df.applymap(lambda x : 'add-'+str(x))

print('map:')print(df)#分组,对每一组的数据进行处理df_group=df.groupby('team_name')i=0for name,group in df_group: if i>0 and i<3:  print('name:',name)  print('group:',group[['num','phone']])  print('-------') i+=1

#根据某一列排序df.sort_values(by='phone',ascending=False)print(df)#存储df.to_csv('last.csv',encoding='utf8',sep='\t',index=False)

参考资料

https://blog.csdn.net/chendianfc/article/details/75136574 https://blog.csdn.net/mym_74/article/details/102887466

dataframe两个表合并_python处理DataFrame数据的一些常用操作相关推荐

  1. dataframe两个表合并_DataFrame踩坑整理(一)

    不得不说,工作中几乎天天跟DataFrame打交道,真的很有总结和记住的必要,话不多说,直接上干货.输入以下语句前别忘记: import pandas as pd import numpy as np ...

  2. dataframe两个表合并_Spark实战第二版(涵盖Spark3.0)第三章 宏伟的角色dataframe

    关注公众号: 登峰大数据 ,阅读Spark实战第二版(完整中文版),系统学习Spark3.0大数据框架! 如果您觉得作者翻译的内容有帮助,请分享给更多人.您的分享,是作者翻译的动力! 本章涵盖了 使用 ...

  3. dataframe两个表合并_史上代码最少的工作表拆分,仅需5行,不可思议

    工作中,很多小伙伴都会遇到一些需求,将一份Excel文档按照部门进行拆分,每个部门是一个单独的工作表,或者每个部门整理的工作表汇总为一份总的工作表.读者需要注意的是,多个工作表的拆分与合并,始终在一个 ...

  4. dataframe两个表合并_Part25:Pandas基础(Series,DataFrame类的创建、索引、切片、算术方法)...

    一.为什么学习pandas numpy已经可以帮助我们进行数据的处理了,那么学习pandas的目的是什么呢? numpy能够帮助我们处理的是数值型的数据,当然在数据分析中除了数值型的数据还有好多其他类 ...

  5. dataframe两个表合并_Spark DataFrame 不是真正的 DataFrame

    从这篇文章开始,我们专栏开始一个新的读 paper 系列. 今天要介绍的 paper 是 Towards Scalable Dataframe Systems,目前还是预印本.作者 Devin Pet ...

  6. dataframe两个表合并_R语言读取多个excel文件后合并:rbind/merge/cmd合并

    问题: 该文件夹下的三个文件理论上列名完全一致,但是在用rbind合并时却提示上述错误,(只能理解为列名确实是不一致导致的问题)解决如下: (1)首先,rbind和cbind()也适用于datafra ...

  7. dataframe两个表合并_DAXSQLPython实现报表项目存在串行的财务报表合并

       点击"数字化审计",可以关注哦! 开篇啰嗦话 在前文"Dax实战-多年财务报表项目存在串行的合并"中,我为你介绍了多年财务报表合并过程中问题的起因和解决串 ...

  8. oracle横向合并两张表,SQL中将两个表合并成一个新表 SQL如何合并两个表并生成一个新表?...

    sql把两个表合并成一个新表的语句应该怎么写SQL SERVER: select * into 表3 from ( select 字段列表1 from 表1 union all select 字段列表 ...

  9. mysql如何把两张表合并为一张表_mysql多表合并为一张表

    有人提出要将4张表合并成一张.数据量比较大,有4千万条数据.有很多重复数据,需要对某一列进行去重. 数据量太大的话,可以看我另外一篇:http://www.cnblogs.com/magmell/p/ ...

  10. 在Excel表格中如何快速检查两张表的不一样的数据

    在Excel表格中如何快速检查两张表的不一样的数据 目录 在Excel表格中如何快速检查两张表的不一样的数据 1.全选第一张表格,找到"开始"选项卡中"条件格式" ...

最新文章

  1. Linux系统管理必备知识之利用ssh传输文件
  2. 批量修改数据映射_Docker 数据卷操作「Docker 系列-6」
  3. 【计算机视觉】跟踪算法及相关主页
  4. zoj3381 Osaisen Choudai!
  5. Cloudstreams: 云间整合的下一个挑战
  6. 图书推荐(持续更新)
  7. Linux grep命令、Linux cd命令、Linux pwd命令
  8. matlab线性拉伸函数,采用线性变换对图像的每一个像素灰度作线性拉伸-Read.PPT
  9. Python for循环中使用index索引
  10. 大数据毕设/课设 - 基于大数据的全国疫情实时监控大屏系统设计与实现
  11. idea TODO注释功能的使用
  12. 图解技术原理,真的太赞了!
  13. bugku ctf 妹子的陌陌 (想要妹子陌陌号吗? 做题来拿吧)
  14. MedianFlow中值流跟踪算法源码
  15. 基于linux下的shell脚本的编写
  16. RALL机制的线程锁
  17. UI设计教程之常见的APP小图标类型以及用途梳理
  18. 【CYH-02】noip2018数论模拟赛:赛后题解
  19. Python 中 __dict__的用法
  20. 强化学习(一)-->隐马尔科夫模型HMM-->HMM模型基础

热门文章

  1. 使用IDEA工具远程调试SpringBoot应用
  2. 微信小程序学习(二)党费计算实例
  3. android 动画闪屏问题,Android中闪屏实现方法小结(普通闪屏、倒计时闪屏、倒计时+动画...
  4. 金蝶KIS标准迷你版专业版 K3 引出报表提示保存文件失败,原因:Automation错误
  5. 计算机网络按覆盖地域分为,计算机网络按其所覆盖的地域范围一般可分为________ 。...
  6. Android性能优化最佳实践,知乎上转疯了!
  7. 安卓开发必须会的技能!Android性能优化最佳实践,知乎上转疯了!
  8. 链家网深圳租房信息分析报告
  9. c语言调用min()函数求最小值,min函数(min函数多条件求最小值)
  10. 第9节-学会使用cookie-互动练习-“解密加密文章”