• 主页
  • 课程

    关于课程

    • 课程归档
    • 成为一名讲师
    • 讲师信息
    教学以及管理操作教程

    教学以及管理操作教程

    ¥1,000.00 ¥100.00
    阅读更多
  • 特色
    • 展示
    • 关于我们
    • 问答
  • 事件
  • 个性化
  • 博客
  • 联系
  • 站点资源
    有任何问题吗?
    (00) 123 456 789
    weinfoadmin@weinformatics.cn
    注册登录
    恒诺新知
    • 主页
    • 课程

      关于课程

      • 课程归档
      • 成为一名讲师
      • 讲师信息
      教学以及管理操作教程

      教学以及管理操作教程

      ¥1,000.00 ¥100.00
      阅读更多
    • 特色
      • 展示
      • 关于我们
      • 问答
    • 事件
    • 个性化
    • 博客
    • 联系
    • 站点资源

      老俊俊的生信笔记

      • 首页
      • 博客
      • 老俊俊的生信笔记
      • python 学习之 pandas 读取文本数据

      python 学习之 pandas 读取文本数据

      • 发布者 weinfoadmin
      • 分类 老俊俊的生信笔记
      • 日期 2022年3月12日
      测试开头

      python 学习之 pandas 读取文本数据
      点击上方,关注老俊俊!

      1引言

      pandas 提供了一些用于将表格型数据读取为 DataFrame 对象的函数。其中 read_csv 和 read_table 可能会是你今后用得最多的。

      主要介绍这两个。

      python 学习之 pandas 读取文本数据

      2介绍

      首先我们来看一个以逗号分隔的(CSV)文 本文件:

      In [8]: !cat examples/ex1.csv
      a,b,c,d,message
      1,2,3,4,hello
      5,6,7,8,world
      9,10,11,12,foo

      由于该文件以逗号分隔,所以我们可以使用 read_csv 将其读入一个 DataFrame:

      In [9]: df = pd.read_csv('examples/ex1.csv')

      In [10]: df
      Out[10]:
      a b c d message
      0 1 2 3 4 hello
      1 5 6 7 8 world
      2 9 10 11 12 foo

      我们还可以使用 read_table,并指定分隔符:

      In [11]: pd.read_table('examples/ex1.csv', sep=',')
      Out[11]:
      a b c d message
      0 1 2 3 4 hello
      1 5 6 7 8 world
      2 9 10 11 12 foo

      并不是所有文件都有标题行。看看下面这个文件:

      In [12]: !cat examples/ex2.csv
      1,2,3,4,hello
      5,6,7,8,world
      9,10,11,12,foo

      读入该文件的办法有两个。你可以让 pandas 为其分配默认的列名,也可以自己定义列名:

      In [13]: pd.read_csv('examples/ex2.csv', header=None)
      Out[13]:
        0 1 2 3 4
      0 1 2 3 4 hello
      1 5 6 7 8 world
      2 9 10 11 12 foo

      In [14]: pd.read_csv('examples/ex2.csv', names=['a', 'b', 'c', 'd', 'message'])
      Out[14]:
        a b c d message
      0 1 2 3 4 hello
      1 5 6 7 8 world
      2 9 10 11 12 foo

      假设你希望将 message 列做成 DataFrame 的索引。你可以明确表示要将该列放到索引 4 的位置上, 也可以通过index_col参数指定”message”:

      In [15]: names = ['a', 'b', 'c', 'd', 'message']

      In [16]: pd.read_csv('examples/ex2.csv', names=names, index_col='message')
      Out[16]:
            a b c d message
      hello 1 2 3 4
      world 5 6 7 8
      foo 9 10 11 12

      如果希望将多个列做成一个层次化索引,只需传入由列编号或列名组成的列表即可:

      In [17]: !cat examples/csv_mindex.csv
      key1,key2,value1,value2
      one,a,1,2
      one,b,3,4
      one,c,5,6
      one,d,7,8
      two,a,9,10
      two,b,11,12
      two,c,13,14
      two,d,15,16

      In [18]: parsed = pd.read_csv('examples/csv_mindex.csv',
        ....: index_col=['key1', 'key2'])

      In [19]: parsed
      Out[19]:
        value1 value2
      key1 key2
      one a 1 2
          b 3 4
          c 5 6
          d 7 8
      two a 9 10
          b 11 12
          c 13 14
          d 15 16

      有些情况下,有些表格可能不是用固定的分隔符去分隔字段的(比如空白符或其它模式)。看看下面这个文本文件:

      In [20]: list(open('examples/ex3.txt'))
      Out[20]:
      ['          A          B        Cn',
      'aaa -0.264438 -1.026059 -0.619500n',
      'bbb 0.927272 0.302904 -0.032399n',
      'ccc -0.264273 -0.386314 -0.217601n',
      'ddd -0.871858 -0.348382 1.100491n']

      虽然可以手动对数据进行规整,这里的字段是被数量不同的空白字符间隔开的。这种情况下,你可 以传递一个 正则表达式 作为 read_table 的分隔符。可以用正则表达式表达为 s+,于是有:

      In [21]: result = pd.read_table('examples/ex3.txt', sep='s+')

      In [22]: result
      Out[22]:
                  A         B         C
      aaa -0.264438 -1.026059 -0.619500
      bbb 0.927272 0.302904 -0.032399
      ccc -0.264273 -0.386314 -0.217601
      ddd -0.871858 -0.348382 1.100491

      这里,由于列名比数据行的数量少,所以 read_table 推断第一列应该是 DataFrame 的索引。

      这些解析器函数还有许多参数可以帮助你处理各种各样的异形文件格式(表列出了一些)。比如说,你可以用skiprows跳过文件的第一行、第三行和第四行:

      In [23]: !cat examples/ex4.csv
      # hey!
      a,b,c,d,message
      # just wanted to make things more difficult for you
      # who reads CSV files with computers, anyway?
      1,2,3,4,hello
      5,6,7,8,world
      9,10,11,12,foo

      In [24]: pd.read_csv('examples/ex4.csv', skiprows=[0, 2, 3])
      Out[24]:
      a b c d message
      0 1 2 3 4 hello
      1 5 6 7 8 world
      2 9 10 11 12 foo

      缺失值处理是文件解析任务中的一个重要组成部分。缺失数据经常是要么没有(空字符串),要么 用某个标记值表示。默认情况下,pandas 会用一组经常出现的标记值进行识别,比如 NA 及 NULL:

      In [25]: !cat examples/ex5.csv
      something,a,b,c,d,message
      one,1,2,3,4,NA
      two,5,6,,8,world
      three,9,10,11,12,foo

      In [26]: result = pd.read_csv('examples/ex5.csv')
      In [27]: result
      Out[27]:
      something a b c d message
      0 one 1 2 3.0 4 NaN
      1 two 5 6 NaN 8 world
      2 three 9 10 11.0 12 foo

      In [28]: pd.isnull(result)
      Out[28]:
        something a b c d message
      0 False False False False False True
      1 False False False True False False
      2 False False False False False False

      na_values可以用一个列表或集合的字符串表示缺失值:

      In [29]: result = pd.read_csv('examples/ex5.csv', na_values=['NULL'])

      In [30]: result
      Out[30]:
      something a b c d message
      0 one 1 2 3.0 4 NaN
      1 two 5 6 NaN 8 world
      2 three 9 10 11.0 12 foo

      字典的各列可以使用不同的 NA 标记值:

      In [31]: sentinels = {'message': ['foo', 'NA'], 'something': ['two']}

      In [32]: pd.read_csv('examples/ex5.csv', na_values=sentinels)
      Out[32]:
      something a b c d message
      0 one 1 2 3.0 4 NaN
      1 NaN 5 6 NaN 8 world
      2 three 9 10 11.0 12 NaN

      下面列出了 pandas.read_csv 和 pandas.read_table 常用的选项:

      python 学习之 pandas 读取文本数据
      python 学习之 pandas 读取文本数据

      3逐块读取文本文件

      在处理很大的文件时,或找出大文件中的参数集以便于后续处理时,你可能只想读取文件的一小部 分或逐块对文件进行迭代。

      在看大文件之前,我们先设置 pandas 显示地更紧些:

      In [33]: pd.options.display.max_rows = 10

      然后有:

      In [34]: result = pd.read_csv('examples/ex6.csv')

      In [35]: result
      Out[35]:
      one two three four key
      0 0.467976 -0.038649 -0.295344 -1.824726 L
      1 -0.358893 1.404453 0.704965 -0.200638 B
      2 -0.501840 0.659254 -0.421691 -0.057688 G
      3 0.204886 1.074134 1.388361 -0.982404 R
      4 0.354628 -0.133116 0.283763 -0.837063 Q
      ... ... ... ... ... ..
      9995 2.311896 -0.417070 -1.409599 -0.515821 L
      9996 -0.479893 -0.650419 0.745152 -0.646038 E
      9997 0.523331 0.787112 0.486066 1.093156 K
      9998 -0.362559 0.598894 -1.843201 0.887292 G
      9999 -0.096376 -1.012999 -0.657431 -0.573315 0
      [10000 rows x 5 columns]
      If you want to only read a small

      如果只想读取几行(避免读取整个文件),通过nrows进行指定即可:

      In [36]: pd.read_csv('examples/ex6.csv', nrows=5)
      Out[36]:
              one two three four key
      0 0.467976 -0.038649 -0.295344 -1.824726 L
      1 -0.358893 1.404453 0.704965 -0.200638 B
      2 -0.501840 0.659254 -0.421691 -0.057688 G
      3 0.204886 1.074134 1.388361 -0.982404 R
      4 0.354628 -0.133116 0.283763 -0.837063 Q

      要逐块读取文件,可以指定 chunksize (行数):

      In [874]: chunker = pd.read_csv('ch06/ex6.csv', chunksize=1000)

      In [875]: chunker
      Out[875]: <pandas.io.parsers.TextParser at 0x8398150>

      read_csv 所返回的这个 TextParser 对象使你可以根据 chunksize 对文件进行逐块迭代。比如说,我 们可以迭代处理 ex6.csv,将值计数聚合到”key”列中,如下所示:

      chunker = pd.read_csv('examples/ex6.csv', chunksize=1000)

      tot = pd.Series([])
      for piece in chunker:
        tot = tot.add(piece['key'].value_counts(), fill_value=0)
      tot = tot.sort_values(ascending=False)

      然后有:

      In [40]: tot[:10]
      Out[40]:
      E 368.0
      X 364.0
      L 346.0
      O 343.0
      Q 340.0
      M 338.0
      J 337.0
      F 335.0
      K 334.0
      H 330.0
      dtype: float64

      TextParser 还有一个 get_chunk 方法,它使你可以读取任意大小的块。

      4将数据写出到文本格式

      数据也可以被输出为分隔符格式的文本。我们再来看看之前读过的一个 CSV 文件:

      In [41]: data = pd.read_csv('examples/ex5.csv')
      In [42]: data
      Out[42]:
      something a b c d message
      0 one 1 2 3.0 4 NaN
      1 two 5 6 NaN 8 world
      2 three 9 10 11.0 12 foo

      利用 DataFrame 的 to_csv 方法,我们可以将数据写到一个以逗号分隔的文件中:

      In [43]: data.to_csv('examples/out.csv')

      In [44]: !cat examples/out.csv
      ,something,a,b,c,d,message
      0,one,1,2,3.0,4,
      1,two,5,6,,8,world
      2,three,9,10,11.0,12,foo

      当然,还可以使用其他分隔符(由于这里直接写出到 sys.stdout,所以仅仅是打印出文本结果而已):

      In [45]: import sys

      In [46]: data.to_csv(sys.stdout, sep='|')
      |something|a|b|c|d|message
      0|one|1|2|3.0|4|
      1|two|5|6||8|world
      2|three|9|10|11.0|12|foo

      缺失值在输出结果中会被表示为空字符串。你可能希望将其表示为别的标记值:

      In [47]: data.to_csv(sys.stdout, na_rep='NULL')
      ,something,a,b,c,d,message
      0,one,1,2,3.0,4,NULL
      1,two,5,6,NULL,8,world
      2,three,9,10,11.0,12,foo

      如果没有设置其他选项,则会写出行和列的标签。当然,它们也都可以被禁用:

      In [48]: data.to_csv(sys.stdout, index=False, header=False)
      one,1,2,3.0,4,
      two,5,6,,8,world
      three,9,10,11.0,12,foo

      此外,你还可以只写出一部分的列,并以你指定的顺序排列:

      In [49]: data.to_csv(sys.stdout, index=False, columns=['a', 'b', 'c'])
      a,b,c
      1,2,3.0
      5,6,
      9,10,11.0

      Series 也有一个 to_csv 方法:

      In [50]: dates = pd.date_range('1/1/2000', periods=7)

      In [51]: ts = pd.Series(np.arange(7), index=dates)

      In [52]: ts.to_csv('examples/tseries.csv')

      In [53]: !cat examples/tseries.csv
      2000-01-01,0
      2000-01-02,1
      2000-01-03,2
      2000-01-04,3
      2000-01-05,4
      2000-01-06,5
      2000-01-07,6

      5处理分隔符格式

      大部分存储在磁盘上的表格型数据都能用 pandas.read_table 进行加载。然而,有时还是需要做一 些手工处理。由于接收到含有畸形行的文件而使 read_table 出毛病的情况并不少见。为了说明这些 基本工具,看看下面这个简单的 CSV 文件:

      In [54]: !cat examples/ex7.csv "a","b","c"
      "1","2","3"
      "1","2","3"

      对于任何单字符分隔符文件,可以直接使用 Python 内置的 csv 模块。将任意已打开的文件或文件型 的对象传给csv.reader:

      import csv
      f = open('examples/ex7.csv')

      reader = csv.reader(f)

      对这个 reader 进行迭代将会为每行产生一个元组(并移除了所有的引号):对这个 reader 进行迭代将会为每行产生一个元组(并移除了所有的引号):

      In [56]: for line in reader:
        ....: print(line)
      ['a', 'b', 'c']
      ['1', '2', '3']
      ['1', '2', '3']

      现在,为了使数据格式合乎要求,你需要对其做一些整理工作。我们一步一步来做。首先,读取文件到一个多行的列表中:

      In [57]: with open('examples/ex7.csv') as f:
        ....: lines = list(csv.reader(f))

      然后,我们将这些行分为标题行和数据行:

      In [58]: header, values = lines[0], lines[1:]

      然后,我们可以用字典构造式和zip(*values),后者将行转置为列,创建数据列的字典:

      In [59]: data_dict = {h: v for h, v in zip(header, zip(*values))}

      In [60]: data_dict
      Out[60]: {'a': ('1', '1'), 'b': ('2', '2'), 'c': ('3', '3')}

      6读取 Microsoft Excel 文件

      pandas 的 ExcelFile 类或 pandas.read_excel 函数支持读取存储在 Excel 2003(或更高版本)中的表 格型数据。这两个工具分别使用扩展包 xlrd 和 openpyxl 读取 XLS 和 XLSX 文件。你可以用 pip 或 conda 安装它们。

      要使用 ExcelFile,通过传递 xls 或 xlsx 路径创建一个实例:

      In [104]: xlsx = pd.ExcelFile('examples/ex1.xlsx')

      存储在表单中的数据可以read_excel读取到 DataFrame:

      In [105]: pd.read_excel(xlsx, 'Sheet1')
      Out[105]:
      a b c d message
      0 1 2 3 4 hello
      1 5 6 7 8 world
      2 9 10 11 12 foo

      如果要读取一个文件中的多个表单,创建 ExcelFile 会更快,但你也可以将文件名传递到 pandas.read_excel:

      In [106]: frame = pd.read_excel('examples/ex1.xlsx', 'Sheet1')

      In [107]: frame
      Out[107]:
      a b c d message
      0 1 2 3 4 hello
      1 5 6 7 8 world
      2 9 10 11 12 foo

      如果要将 pandas 数据写入为 Excel 格式,你必须首先创建一个 ExcelWriter,然后使用 pandas 对象的to_excel方法将数据写入到其中:

      In [108]: writer = pd.ExcelWriter('examples/ex2.xlsx')

      In [109]: frame.to_excel(writer, 'Sheet1')

      In [110]: writer.save()

      你还可以不使用 ExcelWriter,而是传递文件的路径到to_excel:

      In [111]: frame.to_excel('examples/ex2.xlsx')



      python 学习之 pandas 读取文本数据


      欢迎加入生信交流群。加我微信我也拉你进 微信群聊 老俊俊生信交流群 哦,数据代码已上传至QQ群,欢迎加入下载。

      群二维码:

      python 学习之 pandas 读取文本数据


      老俊俊微信:


      python 学习之 pandas 读取文本数据

      知识星球:


      python 学习之 pandas 读取文本数据


      所以今天你学习了吗?

      欢迎小伙伴留言评论!

      点击我留言!

      今天的分享就到这里了,敬请期待下一篇!

      最后欢迎大家分享转发,您的点赞是对我的鼓励和肯定!

      如果觉得对您帮助很大,赏杯快乐水喝喝吧!



       往期回顾 




      ◀python 学习之 pandas 的基本功能-下

      ◀ribotish 质控结果复现及重新绘制

      ◀python 学习之 pandas 的基本功能–上

      ◀ggplot 绘制 CNS 级别漂亮峰图

      ◀RNA–seq 组合拳–diff analysis–vocalno plot–basemean plot

      ◀Ribo–seq 数据质控研究–下

      ◀Ribo–seq 数据质控研究–中

      ◀Ribo–seq 数据质控研究–上

      ◀geomtextpath 调整圆形环绕文字

      ◀python 学习之 pandas 的 DataFrame 及索引对象

      ◀...

      测试结尾

      请关注“恒诺新知”微信公众号,感谢“R语言“,”数据那些事儿“,”老俊俊的生信笔记“,”冷🈚️思“,“珞珈R”,“生信星球”的支持!

      • 分享:
      作者头像
      weinfoadmin

      上一篇文章

      南方科技大学第一附属医院诚聘博士后
      2022年3月12日

      下一篇文章

      epistack 优雅的可视化你的基因区域
      2022年3月13日

      你可能也喜欢

      8-1651542331
      跟着Nature学绘图(2) 箱线图-累积分布曲线图
      2 5月, 2022
      9-1651542322
      Julia 笔记之字符串
      2 5月, 2022
      0-1651542343
      Julia 笔记之数学运算和初等函数
      1 5月, 2022

      搜索

      分类

      • R语言
      • TCGA数据挖掘
      • 单细胞RNA-seq测序
      • 在线会议直播预告与回放
      • 数据分析那些事儿分类
      • 未分类
      • 生信星球
      • 老俊俊的生信笔记

      投稿培训

      免费

      alphafold2培训

      免费

      群晖配置培训

      免费

      最新博文

      Nature | 单细胞技术揭示衰老细胞与肌肉再生
      301月2023
      lncRNA和miRNA生信分析系列讲座免费视频课和课件资源包,干货满满
      301月2023
      如何快速批量修改 Git 提交记录中的用户信息
      261月2023
      logo-eduma-the-best-lms-wordpress-theme

      (00) 123 456 789

      weinfoadmin@weinformatics.cn

      恒诺新知

      • 关于我们
      • 博客
      • 联系
      • 成为一名讲师

      链接

      • 课程
      • 事件
      • 展示
      • 问答

      支持

      • 文档
      • 论坛
      • 语言包
      • 发行状态

      推荐

      • iHub汉语代码托管
      • iLAB耗材管理
      • WooCommerce
      • 丁香园论坛

      weinformatics 即 恒诺新知。ICP备案号:粤ICP备19129767号

      • 关于我们
      • 博客
      • 联系
      • 成为一名讲师

      要成为一名讲师吗?

      加入数以千计的演讲者获得100%课时费!

      现在开始

      用你的站点账户登录

      忘记密码?

      还不是会员? 现在注册

      注册新帐户

      已经拥有注册账户? 现在登录

      close
      会员购买 你还没有登录,请先登录
      • ¥99 VIP-1个月
      • ¥199 VIP-半年
      • ¥299 VIP-1年
      在线支付 激活码

      立即支付
      支付宝
      微信支付
      请使用 支付宝 或 微信 扫码支付
      登录
      注册|忘记密码?