python数据分析(三)
data.to_csv(sys.stdout,index=False,columns=[‘a’,‘b’,‘c’],na_rep=‘NULL’)#输出部分列并且可以按照自己规定的顺序。pd.read_csv(‘examples/ex2.csv’,names=[‘a’,‘b’,‘c’,‘d’,‘names’])#自己定义列名names=[‘’]pd.read_table(‘examples/ex1.c
文本数据的读取
- 读取文件操作
df = pd.read_csv(‘examples/ex1.csv’) # 读取.csv文件输出一个DataFrame
pd.read_table(‘examples/ex1.csv’, sep=‘,’) # 用read_table并指定分隔符(sep)
- 列名的命名
pd.read_csv(‘examples/ex2.csv’, header=None) # 默认pandas分配列名
pd.read_csv(‘examples/ex2.csv’, names=[‘a’, ‘b’, ‘c’, ‘d’, ‘names’]) # 自己定义列名names=[‘’]
- 使用参数index_col来具体指定对象的某一列作为新对象的索引
pd.read_csv(‘examples/ex2.csv’, names=names, index_col=‘names’)
- 将多个列做成一个层次化索引,只需传入由列编号或列名组成的列表
#就是将多行相同名字划分为同一个索引名中
df = pd.read_csv(‘examples/csv_mindex.csv’, index_col=[‘key1’, ‘key2’])
- 手动调数据规整,使用read_table(‘文件’, sep=‘按照正则表达式(元字符)作为分隔符’)
df = pd.read_table(‘examples/ex3.txt’, sep=‘\s+’)
- 种各样的异形文件格式,使用skiprows跳过文件的某些不要输出的行
pd.read_csv(‘examples/ex4.csv’, skiprows=[0, 2, 3])
- 查询是否为数据缺失使用isnull(true为缺失值)
df = pd.read_csv(‘examples/ex5.csv’)
pd.isnull(df)
- na_values可以用一个列表或集合的字符串表示缺失值
df = pd.read_csv(‘examples/ex5.csv’, na_values=[‘NULL’])
- 用字典把各列中某些值用NaN来标记
dict = {‘message’: [‘foo’], ‘something’: [‘one’, ‘NA’]} # ‘列名’:[‘值’, ‘NA可加可不加’]
df = pd.read_csv(‘examples/ex5.csv’, na_values=dict)
1.逐块读取文本文件
- 面对很大的文件时,只想读取文件的一小部分或者是逐块对文件进行迭代
#先设置pandas显示地更紧一些
pd.options.display.max_rows = 10
#只想读取几行(避免读取全部),直接通过nrows=xx来指定读取几行数据(按照顺序读取)
pd.read_csv(‘examples/ex6.csv’, nrows=4)
#逐块读取文件,可以指定chunksize(行数)
chunker = pd.read_csv(‘examples/ex6.csv’, chunksize=1000)
#chunker
#read_csv所返回的这个TextParser对象使你可以根据chunksize对文件进行逐块迭代
t1 = pd.Series([])
for piece in chunker:
t1 = t1.add(piece[‘key’].value_counts(), fill_value=0) # 迭代处理ex6.csv,将值计数聚合到"key"列中
t1 = t1.sort_values(ascending=False)
将数据写到文本中
- 数据也可以被输出为分隔符格式的文本
- DataFrame中to_csv()方法的使用
data.to_csv(‘examples/out.csv’) #DataFrame方法to_csv()可以将数据写入out.csv文件中
import sys
data.to_csv(sys.stdout, sep=‘/’) #数据直接写入到sys.stdout,所以输出结果是文本结果
data.to_csv(sys.stdout, na_rep=‘NULL’) #缺失值输出为na_rep=‘NULL’(或者是其它字符、数字)
#可以设置行和列的标签或者是禁用data.to_csv(sys.stdout, index=False, header=False) # 行和列索引标签禁用
data.to_csv(sys.stdout, index=False, columns=[‘a’, ‘b’,‘c’], na_rep=‘NULL’) # 输出部分列并且可以按照自己规定的顺序
- Series中to_csv()方法的使用
dates = pd.date_range('1/1/2000', periods=7)
ts = pd.Series(np.arange(7), index=dates)
ts.to_csv('examples/tseries.csv')
data = pd.read_csv('examples/tseries.csv')
print(data)
处理分隔符的格式要求
CSV以纯文本存储数和文本。文件的每一行就代表一条数据,每条记录包含由逗号分隔一个或多个属性值。
1) 默认读写用逗号做分隔符(delimiter),双引号作引用符(quotechar)
2) 用writer写数据None被写成空字符串,浮点型调用repr()转化成字符串。非字符串型数据被str()成字符串存储。
3) open函数
open('some.csv', newline='', encoding='utf-8')
# 系统默认的编码为unicode)(将文件编码为unicode),同时可使用不同的编码解码文件
# 如果newline=''没有指定,引用字段的换行符将不会被正确解释
- reader迭代产生元组(每行产生一个元组并移除每条记录的引号)
import csv
f = open('examples/ex7.csv')
reader = csv.reader(f) # 将任意打开的文件或文件型的对象传给csv.reader
for i in reader:
print(i) #reader进行迭代将会为每行产生一个元组并输出
输出为
[‘a’, ‘b’, ‘c’]
[‘1’, ‘2’, ‘3’]
[‘1’, ‘2’, ‘3’]
- 为了进一步使数据格式符合要求,按照要求输出所求的字典
with open('examples/ex7.csv') as f:
List = list(csv.reader(f)) # 读取文件到一个多行的列表(元组、字典等)中
# print(List)
header, values = list[0], list[1:] # 将这些行划分为标题行和数据行
data_dict = {h: v for h, v in zip(header, zip(*values))}
print(data_dict)
输出为
{‘a’: (‘1’, ‘1’), ‘b’: (‘2’, ‘2’), ‘c’: (‘3’, ‘3’)}
- zip()函数的用法
参数iterable为可迭代的对象,可以有多个参数。函数返回的是一个以元组为元素的列表,其中第 i 个元组中包含每个参数序列的第 i 个元素。当只有一个序列参数时,它返回一个1元组的列表。当没有参数时,它返回一个空的列表。
import numpy as np
a=[1,2,3]
b=[4,5,6]
c=[7,8,9]
tuple_zip = zip(a, b, c)
tuple_zip1 = zip() # 没有参数
tuple_zip2 = zip(a) # 只有一个序列参数
x, y, z = zip(*tuple_zip) # zip() 和 * 操作符一起操作可以用来 unzip 一个列表
print(tuple_zip)
print(tuple_zip1)
print(tuple_zip2)
print(x)
print(y)
print(z)
# 输出为
[(1, 4, 7), (2, 5, 8), (3, 6, 9)]
[]
[(1,), (2,), (3,)]
(1, 2, 3)
(4, 5, 6)
(7, 8, 9)
- csv文件格式
# 方法1:定义csv.Dialect的一个子类(如专门的分隔符、字符串引用约定、行结束符等) :
class my_dialect(csv.Dialect):
lineterminator = '\n'
delimiter = ';'
quotechar = '"'
quoting = csv.QUOTE_MINIMAL
reader = csv. reader (f , diaect=my_dialect)
# 方法2:各个csv方法的参数以关键字的形式提供给csv.reader :
reader= csv.reader(f, delimiter='|')
| 参数 | 说明 |
|---|---|
| delimiter | 用于分隔字段的单字符字符串。默认为"," |
| lineterminator | 用于写操作的行结束符,默认为“'\r\n ’ 。读操作将忽略此选项,它能认出跨平台的行结束符 |
| quotechar | 用于带有特殊字符(如分隔符)的字段的引用符号。默认为’ " ’ |
| quoting | 引用约定。可选值包括csv.QUOTE _ ALL (引用用所有字段) |
| csv.QUOTE_MINIMAL(引用如分隔符之类特殊字符的字段)默认 | |
| csv.QUOTE_NONNUMERIC | |
| cvsv.QUOTE_NON (不引用) | |
| skipinitialspace | 忽略分隔符后面的空白符。默认为False |
| doublequote | 如何处理字段内的引用符号。如果为True ,则双写。 |
| escapechar | 用于对分隔符进行转义的字符串(如quoting=csv.QUOTE_NONE默认禁用 |
JSON数据
JSON(JavaScript Object Notation的简称)已经成为通过HTTP请求在Web浏览器和其他应用程序之间发送数据的标准格式之一。它是一种比表格型文本格式(如CSV)灵活得多的数据格式。并且允许有空值(null)和末尾不允许存在多余逗号等,对象中所有的键都必须是字符串。
# 创建一个JSON
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"]}]
}
"""
# 1)用json.loads来将将JSON字符串转换成Python形式
import json
Python_json = json.loads(obj)
Python_json
# 输出为
{'name': 'Wes',
'places_lived': ['United States', 'Spain', 'Germany'],
'pet': None,
'siblings': [{'name': 'Scott', 'age': 30, 'pets': ['Zeus', 'Zuko']},
{'name': 'Katie', 'age': 38, 'pets': ['Sixes', 'Stache', 'Cisco']}]}
# 2)用json.dumps来将Python对象转换成JSON格式
json_python = json.dumps(Python_json)
# 3)将一组或一个JSON对象转换为DataFRame或Series便于数据分析
DataFRame_Json = pd.DataFrame(result['siblings'], columns=['name', 'age'])
# result['siblings']是向DataFrame传入一个字典的列表(就是原先的JSON对象),columns是来选取JSON数据字段的子集
DataFRame_Json
#输出为
name age
0 Scott 30
1 Katie 38
# 4)pd.read_json可以自动将特别格式的JSON数据集转换为Series或DataFrame
# example.json为
[{"a": 1, "b": 2, "c": 3},
{"a": 4, "b": 5, "c": 6},
{"a": 7, "b": 8, "c": 9}]
data = pd.read_json('examples/example.json')
data
# 输出为
a b c
0 1 2 3
1 4 5 6
2 7 8 9
# 5)将数据从pandas输出到JSON是要to_json方法
data.to_json()
data.to_json(orient='records') # 以列表输出,列表以字典为元素输出
# 输出为
{"a":{"0":1,"1":4,"2":7},"b":{"0":2,"1":5,"2":8},"c":{"0":3,"1":6,"2":9}}
[{"a":1,"b":2,"c":3},{"a":4,"b":5,"c":6},{"a":7,"b":8,"c":9}]
更多推荐
所有评论(0)