乐趣区

关于python:利用-Python-进行数据分析-4-数据的导入导出

在数据分析中,咱们个别不会像前几篇文章那样本人发明数据,而是须要利用内部数据。本篇要解决两个问题:

  • 如何将内部数据导入,并转换为 DataFrame?
  • 如何将 DataFrame 导出为罕用的文件格式?

4.1 读取文本数据

本篇文章用到的数据,能够从 GitHub 上下载:https://github.com/wesm/pydat…

4.1.1 csv 数据:解决题目行

咱们能够从 csv 数据动手,看看如何将 csv 数据导入为 DataFrame:

 in: df = pd.read_csv('examples\ex1.csv')  
     df
out:    a   b   c   d message
     0  1   2   3   4   hello
     1  5   6   7   8   world
     2  9  10  11  12     foo

如果你用的是 PyCharm IDE 的话,看看 Console 中的变量局部,变量“df”的左边会有一个“view as DataFrame”的按钮。点击它,你能够看到这样的视图:

这个视图在数据量很大的时候很有用,能帮你粗略地检视数据。

除了 pd.read_csv() 外,pandas 还提供了读取其余模式数据的办法,如 pd.read_table(), pd. read_json(), pd.read_excel() 等。

pd.read_table('examples\ex1.csv', sep=',')  # 因为 pd.read_table() 的默认分隔符是 tab,咱们须要手动指定一下,以关上咱们的文件

如果文件没有题目行(字段名 / 列名),该怎么做?

 in: pd.read_csv('examples\ex2.csv')
out:    1   2   3   4  hello  # 能够看到,pandas 默认认为第一行是题目行,这和咱们想要的后果不符
     0  5   6   7   8  world 
     1  9  10  11  12    foo
 
 in: pd.read_csv('examples\ex2.csv', header=None)  # 这样就能够让 pandas 不把第一行视为题目行
out:    0   1   2   3      4  # pandas 默认生成了一行间断数作为题目行
     0  1   2   3   4  hello
     1  5   6   7   8  world
     2  9  10  11  12    foo
 
 in: pd.read_csv('examples\ex2.csv', names=['a','b','c','d','message'])  # 能够像这样给每列取个名字
out:    a   b   c   d message
     0  1   2   3   4   hello
     1  5   6   7   8   world
     2  9  10  11  12     foo
 
 in: pd.read_csv('examples\ex2.csv', names=['a','b','c','d','message'],index_col='message')  # 还能够把 message 这列作为 DataFrame 的行索引
out:          a   b   c   d
     message               
     hello    1   2   3   4
     world    5   6   7   8
     foo      9  10  11  12

4.1.2 txt 数据:解决分隔符

csv 数据相对来说更规定,那么如何读取 txt 数据呢?

咱们来看个 txt 数据的例子:

 in: with open('examples\ex3.txt','r') as f:  # 这样能够用一般的 python 办法关上一个 txt 文件
         print(f.read())  
out:             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  # 看上去非常整洁
        
 in: list(open('examples\ex3.txt'))  # 换种形式看看
out: ['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']
# 能够看到这个 txt 文件中,充斥着分隔符,分隔符包含:单个空格、多个空格和换行符

当初让咱们来将这个 txt 数据导入为 DataFrame:

 in: df = pd.read_table('examples\ex3.txt')
     df
out:                A         B         C
     0  aaa -0.264438 -1.026059 -0.619500
     1  bbb  0.927272  0.302904 -0.032399
     2  ccc -0.264273 -0.386314 -0.217601
     3  ddd -0.871858 -0.348382  1.100491  # 这个后果看上去很好
        
 in: df.columns  # 但如果咱们看看它的列标签,咱们就会晓得这不是咱们想要的后果
out: Index(['A         B         C'], dtype='object')

呈现上述问题的起因是,不同的分隔符让 pandas 难以辨认行与列的分隔。如何解决这个问题呢?咱们能够像后面提到的,指定 sep 参数,让 pandas 辨认出分隔符。然而分隔符包含单个空格、多个空格和换行符,如何示意这三种分隔符呢?咱们用到了正则表达式:

# 此处用到了正则表达式:\s 代表空格和换行符,+ 代表能够包含 1 个至多个加号后面的字符——即多个空格
 in: df = pd.read_table('examples\ex3.txt',sep='\s+')
     df.columns
out: Index(['A', 'B', 'C'], dtype='object')  # 这回是咱们想要的后果了

4.1.3 跳过表格前几行

有的人在编写表格时,喜爱在表格的前几行备注一些信息。咱们须要跳过无意义的备注信息。

比方这个文件“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

咱们想要跳过无意义的第 1、3、4 行,只须要指定 skiprows 参数就能够了:

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

4.1.4 excel 数据

现在,咱们解决表格数据最罕用的软件就是 Excel,保留下来的表格文件,通常是 xlsx 文件。我最罕用的关上此类数据的形式是:

path = r'一个数据.xlsx'
df = pd.read_excel(path, engine='openpyxl', dtype=object, keep_default_na=False)

让我来解释一下 pd.read_excel() 中我应用的参数:

  • 之前已经呈现过 Excel xlsx file; not supported – 简书 (jianshu.com) 这篇文章形容过的谬误,因而我导入 xlsx 文件是通常会把 engine 参数设置为 ‘openpyxl’。但当初仿佛不再须要了。
  • dtype 设置为 object,能够保留数据的原貌
  • keep_default_na = False 能够不将缺失值设置为 NaN

4.1.5 缺失值解决

让咱们来看一个有缺失值的数据:

 in: pd.read_csv('examples\ex5.csv')
out:   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

如果你不想让缺失值体现为 NaN,那么能够像下面一样,设置 keep_default_na = False。

如果除了空值,其余的某个值(比方 foo)也代表缺失值,咱们想让等于 foo 的值也体现为 NaN:

 in: pd.read_csv('examples\ex5.csv',na_values=['foo'])
out:   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     NaN

4.1.6 JSON 数据

咱们在解决从网上爬到的数据时,往往须要解决 JSON 数据。如:

 in: 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"]}]
     }
     """  # 咱们定义一个 JSON 数据
     obj  # 咱们失去了一个 JSON 格局的字符串
out: '\n{"name":"Wes",\n"places_lived": ["United States","Spain","Germany"],\n"pet": null,\n"siblings": [{"name":"Scott","age": 30,"pets": ["Zeus","Zuko"]},\n              {"name":"Katie","age": 38,\n"pets": ["Sixes","Stache","Cisco"]}]\n}\n'

为了可能解决这个 JSON 字符串,咱们须要将它转换为 Python 的字典模式:

 in: import json
     result = json.loads(obj)  # 咱们通过 json.loads() 进行转换
     result  # 能够看到,当初它变成了一个字典
out: {'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']}]}

当初,这个数据就能够转化为 DataFrame 解决了:

 in: pd.DataFrame(result['siblings'])  # 传入字典列表
out:     name  age                    pets
     0  Scott   30            [Zeus, Zuko]
     1  Katie   38  [Sixes, Stache, Cisco]
        
 in: pd.DataFrame(result['siblings'],columns=['name','age'])
out:     name  age
     0  Scott   30
     1  Katie   38

Python 字典同样能够转换回 JSON 字符串:

 in: json.dumps(result)  # 咱们通过 json.dumps() 进行转换
out: '{"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"]}]}'

当然,pandas 也能够间接读取 JSON 文件,然而 JSON 文件的格局最好规整。

 in: pd.read_json('examples/example.json')
out:    a  b  c
     0  1  2  3
     1  4  5  6
     2  7  8  9

4.2 逐块读取文本数据

在解决大文件时,咱们经常心愿读取其中的一小块。

比方这个有 10000 行数据的文件:

# 为了显示难看,咱们先让 pandas 在展现时只显示 10 行
pd.options.display.max_rows = 10  # 让 pandas 在展现的时候只显示 10 行

 in: df = pd.read_csv('examples/ex6.csv')
     df
out:            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]

为了逐块读取文件,咱们须要指定块的大小。比方,咱们按一块 1000 行来读取。

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)

4.3 导出数据

表格数据咱们通常会导出为 csv 或 xlsx 文件。这样就能够导出了:

data = pd.read_csv('examples/ex5.csv')  # 首先咱们读一个文件

path = r"一个文件.csv"
data.to_csv(path)  # 这样就导出了

path = r"一个文件.xlsx"
data.to_excel(path, index=False)  # 将 index 设置为 False 能够不输入索引

注:转载请注明出处。

本文属于《利用 Python 进行数据分析》读书笔记系列:

利用 Python 进行数据分析 —— 1 数据结构、函数和文件
利用 Python 进行数据分析 —— 2 NumPy 根底
利用 Python 进行数据分析 —— 3 pandas 入门

退出移动版