笔记小结:《利用Python进行数据分析》之读取数据

news2024/11/23 2:30:40

目录

读取文本格式的数据

 基本操作

指定分隔符

指定标题行

层次化索引

使用正则表达式分隔

跳过某些行

 缺失值处理

逐块读取文本文件

设置显示的最大行数

只读取几行

逐块读取文件

将数据写出到文本格式

基本操作

使用其它分隔符

使用其它标记符标记空白字符串

禁用标签

只显示部分列

处理分隔符格式

JSON数据

基本介绍

与python中数据结构的转化


读取文本格式的数据

 基本操作

首先我们来看一个以逗号分隔的(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
层次化索引

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

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         C\n',
 'aaa -0.264438 -1.026059 -0.619500\n',
 'bbb  0.927272  0.302904 -0.032399\n',
 'ccc -0.264273 -0.386314 -0.217601\n',
 'ddd -0.871858 -0.348382  1.100491\n']

虽然可以手动对数据进行规整,这里的字段是被数量不同的空白字符间隔开的。这种情况下,你可以传递一个正则表达式作为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

当使用sep='\s+'时,它意味着分隔符是任意数量的空白字符,包括空格、制表符、换行符等。

正则表达式'\s+'可以分解如下:

  • \s 表示任何空白字符。
  • + 表示一个或多个前面的字符。

所以,当你在读取文件时指定sep='\s+',Pandas会将任意数量的连续空白字符视为单个字段分隔符。这在处理不规则的文本文件时非常有用,尤其是当字段之间可能有多于一个空格或制表符时。

跳过某些行

使用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

逐块读取文本文件

设置显示的最大行数
In [33]: pd.options.display.max_rows = 10 #最多显示十行
只读取几行

通过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)
  1. chunker = pd.read_csv('examples/ex6.csv', chunksize=1000): 这行代码开始读取名为'examples/ex6.csv'的CSV文件,并且指定了chunksize=1000,这意味着Pandas将分批次读取文件,每批次包含1000行数据。

  2. tot = pd.Series([]): 这行代码初始化了一个空的Pandas Series对象,用于累积每块数据中'key'列的计数。

  3. 循环for piece in chunker:: 这个循环遍历由chunker生成的每个数据块(每个数据块包含1000行)。

  4. tot = tot.add(piece['key'].value_counts(), fill_value=0): 对于每个数据块,使用value_counts()方法计算'key'列中每个值的出现次数,然后使用add()方法将这些计数累加到tot Series中。参数fill_value=0确保在tot中不存在的键在累加时使用0作为默认值。

  5. tot = tot.sort_values(ascending=False): 在所有数据块处理完毕后,对tot Series进行排序,ascending=False参数表示降序排序。

  6. In [40]: tot[:10]: 这行代码输出tot Series的前10个元素,显示了出现次数最多的10个'key'值。

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

将数据写出到文本格式

基本操作

利用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

处理分隔符格式

CSV文件的形式有很多。只需定义csv.Dialect的一个子类即可定义出新格式(如专门的分隔符、字符串引用约定、行结束符等):

class my_dialect(csv.Dialect):
    lineterminator = '\n'
    delimiter = ';'
    quotechar = '"'
    quoting = csv.QUOTE_MINIMAL
reader = csv.reader(f, dialect=my_dialect)

各个CSV语支的参数也可以用关键字的形式提供给csv.reader,而无需定义子类:

reader = csv.reader(f, delimiter='|')

要手工输出分隔符文件,你可以使用csv.writer。它接受一个已打开且可写的文件对象以及跟csv.reader相同的那些语支和格式化选项:

with open('mydata.csv', 'w') as f:
    writer = csv.writer(f, dialect=my_dialect)
    writer.writerow(('one', 'two', 'three'))
    writer.writerow(('1', '2', '3'))
    writer.writerow(('4', '5', '6'))
    writer.writerow(('7', '8', '9'))

JSON数据

基本介绍

JSON(JavaScript Object Notation的简称)已经成为通过HTTP请求在Web浏览器和其他应用程序之间发送数据的标准格式之一。它是一种比表格型文本格式(如CSV)灵活得多的数据格式。下面是一个例子:

obj = """
{"name": "Wes",
 "places_lived": ["United States", "Spain", "Germany"],
 "pet": null,
 "siblings": [{"name": "Scott", "age": 30, "pets": ["Zeus", "Zuko"]},
              {"name": "Katie", "age": 38,
               "pets": ["Sixes", "Stache", "Cisco"]}]
}
"""

除其空值null和一些其他的细微差别(如列表末尾不允许存在多余的逗号)之外,JSON非常接近于有效的Python代码。基本类型有对象(字典)、数组(列表)、字符串、数值、布尔值以及null。对象中所有的键都必须是字符串。

与python中数据结构的转化

许多Python库都可以读写JSON数据。我将使用json,因为它是构建于Python标准库中的。通过json.loads即可将JSON字符串转换成Python形式:

In [62]: import json
In [63]: result = json.loads(obj)
In [64]: result
Out[64]: 
{'name': 'Wes',
 'pet': None,
 'places_lived': ['United States', 'Spain', 'Germany'],
 'siblings': [{'age': 30, 'name': 'Scott', 'pets': ['Zeus', 'Zuko']},
  {'age': 38, 'name': 'Katie', 'pets': ['Sixes', 'Stache', 'Cisco']}]}

json.dumps则将Python对象转换成JSON格式:

In [65]: asjson = json.dumps(result)

如何将(一个或一组)JSON对象转换为DataFrame或其他便于分析的数据结构就由你决定了。最简单方便的方式是:向DataFrame构造器传入一个字典的列表(就是原先的JSON对象),并选取数据字段的子集:

In [66]: siblings = pd.DataFrame(result['siblings'], columns=['name', 'age'])
In [67]: siblings
Out[67]: 
    name  age
0  Scott   30
1  Katie   38

pandas.read_json可以自动将特别格式的JSON数据集转换为Series或DataFrame。例如:

In [68]: !cat examples/example.json
[{"a": 1, "b": 2, "c": 3},
 {"a": 4, "b": 5, "c": 6},
 {"a": 7, "b": 8, "c": 9}]

pandas.read_json的默认选项假设JSON数组中的每个对象是表格中的一行:

In [69]: data = pd.read_json('examples/example.json')
In [70]: data
Out[70]: 
   a  b  c
0  1  2  3
1  4  5  6
2  7  8  9

 如果你需要将数据从pandas输出到JSON,可以使用to_json方法:

In [71]: print(data.to_json())
{"a":{"0":1,"1":4,"2":7},"b":{"0":2,"1":5,"2":8},"c":{"0":3,"1":6,"2":9}}
In [72]: print(data.to_json(orient='records'))
[{"a":1,"b":2,"c":3},{"a":4,"b":5,"c":6},{"a":7,"b":8,"c":9}]

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1970335.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

IoTDB 入门教程 企业篇①——IoTDB企业版(TimechoDB)快速上手

文章目录 一、前文二、试用三、解压四、激活五、启动六、连接七、停止八、IoTDB-Workbench 一、前文 IoTDB入门教程——导读 二、试用 通过天谋科技官网&#xff0c;联系天谋科技的商务。请求免费试用TimechoDB企业版&#xff0c;获得试用软件包 三、解压 iotdb-enterprise…

舞蹈症宝贝的专属锻炼秘籍来啦~✨

嘿宝贝们&#xff01;&#x1f44b; 是不是有时候觉得身体里的“小舞蹈家”总想出来蹦跶两下&#xff0c;但又怕锻炼不当反而“跳”出问题&#xff1f;别怕&#xff0c;今天就给你种草一套超萌又超有效的舞蹈症患者锻炼大法&#xff01;&#x1f389; &#x1f31f;【热身小妖精…

《Milvus Cloud向量数据库指南》——音频数据如何选择合适的 Embedding 模型?

音频数据:PANNs与音频搜索的深度探索 在数字化时代,音频数据作为信息传递的重要载体,其处理与分析技术日益受到关注。与图像搜索领域的“以图搜图”相类似,音频搜索技术也逐步成熟,允许用户基于输入的音频片段快速定位到相似或相关的音频内容。这一技术的实现,离不开强大…

苹果已明确允许 iPhone 和 iPad 上使用 PC 模拟器

苹果公司更新了其应用程序审核指南&#xff0c;允许 PC 模拟器提供 游戏下载&#xff0c;此举可能会改善应用程序商店中模拟器的状况。自苹果公司修订《应用程序审核指南》&#xff0c;允许模拟器进入 App Store 以来已经过去了三个月。虽然已经有很多模拟器被引入商店&#xf…

Python接口自动化测试数据提取分析:Jmespath

1、引言 在处理JSON数据时&#xff0c;我们常常需要提取、筛选或者变换数据。手动编写这些操作的代码不仅繁琐&#xff0c;而且容易出错。Python作为一个功能强大的编程语言&#xff0c;拥有丰富的库和工具来处理这些数据。今天&#xff0c;将介绍一个实用的Python库——JMESP…

SqlLite性能问题

sqlLite性能 最近使用sqlLite做了一些项目工具&#xff0c;对sqlLite的性能大概有了一个比较浅显的了解&#xff0c;在这里分析一下&#xff0c;希望能作为大家做技术选型的参考。 首先是写能力&#xff0c;sqlLite是一个单文件数据库&#xff0c;再加上锁问题&#xff0c;sqlL…

Postman:API开发与测试的强大伴侣

在当今的数字化时代&#xff0c;API&#xff08;应用程序编程接口&#xff09;已成为不同软件系统之间通信的桥梁&#xff0c;它们如同数字世界的“翻译官”&#xff0c;使得数据和服务能够在不同的平台和应用程序之间无缝流动。然而&#xff0c;API的开发、测试和维护并非易事…

大数据-62 Kafka 高级特性 主题 kafka-topics相关操作参数 KafkaAdminClient 偏移量管理

点一下关注吧&#xff01;&#xff01;&#xff01;非常感谢&#xff01;&#xff01;持续更新&#xff01;&#xff01;&#xff01; 目前已经更新到了&#xff1a; Hadoop&#xff08;已更完&#xff09;HDFS&#xff08;已更完&#xff09;MapReduce&#xff08;已更完&am…

内网穿透的应用-Windows系统如何ssh连接群晖nas使用docker安装内网穿透软件

文章目录 前言1. 检查安装Container Manager2. 检查开启群晖SSH连接3. Windows SSH 连接群晖4. 下载Cpolar 镜像5. 群晖Docker安装Cpolar 前言 在某些群晖NAS型号版本&#xff0c;无法使用套件安装的时候&#xff0c;我们可以采用Docker的方式进行安装cpolar内网穿透工具&…

你看不上的“垃圾”——别人的赚钱“利器”

首先说一点&#xff0c;你认为是常识性的东西&#xff0c;也许还有4亿中国人不知道。 其次&#xff0c;你认为是遍地都有的、你看不上的、你瞧不起的这些“破烂玩意”&#xff0c;别人也许正拿来赚钱&#xff01; 不可思议吧&#xff0c;事实就是如此。 我在老家&#xff0c;…

JAVA实战基于SSM的网上书店管理系统

目录 一、前言 二、技术介绍代码 三、项目实现流程 四、论文流程参考 五、核心代码截图 专注于大学生实战开发、讲解和毕业答疑等辅导&#xff0c;获取源码后台 一、前言 针对当前网络实际需求&#xff0c;我们深入剖析了过往系统的弊端&#xff0c;并依托计算机系统的先…

Hiredis_安装_重要API

目录 一 安装HiRedis 二 HiRedis的重要API 2.1 连接redis数据库 2.2 发送请求命令 2.3 释放资源 三 封装一个C版本的HiRedis 一 安装HiRedis 1.下载hiredis软件包 git clone https://github.com/redis/hiredis.git 2.进行解压与安装&#xff0c;步骤如下 cd hiredi…

2000-2022年 上市公司-投融资期限错配、短债长用、短贷长投(原始数据、计算代码、参考文献和最终计算结果)

上市公司在投融资过程中的管理决策对企业的财务稳定性和长期发展至关重要。投融资期限错配、短债长用和短贷长投是企业在资本运作中可能出现的问题&#xff0c;它们影响着企业的财务结构和风险管理。 投融资问题概述 投融资期限错配 指企业资产与债务的期限不匹配&#xff0…

ESG泡沫下的伊利:能否重拾消费者信任?

北京时间7月27日&#xff0c;第33届夏季奥林匹克运动会开幕式在法国巴黎举行&#xff0c;伊利作为中国体育代表团的主要赞助商&#xff0c;再次站在了聚光灯下。然而&#xff0c;在光鲜亮丽的营销背后&#xff0c;伊利正面临着前所未有的信任危机与业绩挑战。 近年来&#xff0…

关于IDEA git push 提交代码报committer 的邮件不是GitLab中的邮箱处理

1、报错截图 2、处理办法&#xff1a; 首先&#xff0c;‌需要检查GitLab的设置&#xff0c;‌确认登记的邮箱地址是否正确。‌ 如果发现邮箱不一致&#xff0c;‌需要更新Git的全局用户邮箱设置&#xff0c;‌以确保与GitLab中登记的邮箱保持一致。‌ 使用命令git config --g…

测试的基础概念

需求 需求的定义 用户需求&#xff1a;可以简单理解为甲方提出的需求&#xff0c;如果没有甲方&#xff0c;那么就是终端用户使用产品时必须要完成的任务。该需求一般比较简略。 软件需求&#xff1a;产品经理会把用户需求转化为软件需求&#xff08;写成一个文档&#xff09;…

软件技术(游戏软件开发方向)实训室解决方案

一、引言 随着数字娱乐产业的快速发展&#xff0c;游戏软件开发成为了一个热门领域。为满足市场对高质量游戏开发人才的需求&#xff0c;构建一套先进、全面、实战化的软件技术&#xff08;游戏软件开发方向&#xff09;实训室解决方案显得尤为重要。本方案旨在通过集成先进硬…

【守卫你的安全】基于高通QCS6490之AI智慧电子围篱展示方案

高通QCS6490是一款专为工业和商业物联网应用而设计的系统单芯片(SoC)&#xff0c;支援高阶物联网装置的Wi-Fi 6E连线&#xff0c;以及先进的摄像头、人工智能和计算功能&#xff0c;以实现低功耗下的强大性能。这款芯片结合高通Kryo™ 670 CPU和高通Hexagon处理器&#xff0c;具…

Redis——哈希

哈希 是一个字符类型的字段和值的映射表&#xff0c;简单来说就是一个键值对的集合&#xff0c;特别适合存储对象&#xff1b; 哈希的命令有 H 有关&#xff1b; 1. 添加键值对 HSET 2. 获取键值对 HGET 3. 判断键值对是否存在 HEXISTS 4. 获取所有键 HKEYS