Python第三方库 - Pandas库

1. Pandas介绍

概念:

PandasPython 的核心数据分析支持库,提供了快速、灵活、明确的数据结构,旨在简单、直观地处理关系型、标记型数据。Pandas 的目标是成为 Python 数据分析实践与实战的必备高级工具,其长远目标是成为最强大、最灵活、可以支持任何语言的开源数据分析工具。经过多年不懈的努力,Pandas 离这个目标已经越来越近了。

2. Pandas基础

2.1 引入

# 引入pandas
import pandas as pd

2.2 数据结构

2.2.1 Series

Pandas Series 类似表格中的一个列(column),类似于一维数组,可以保存任何数据类型。
Series 由索引(index)和列组成,函数如下:

pandas.Series( data, index, dtype, name, copy)
参数解释
data一组数据( ndarray 类型)
index数据索引标签,如果不指定,默认从 0 开始
dtype数据类型,默认会自己判断
name设置名称
copy拷贝数据,默认为 False

举例:

import pandas as pd

1. 创建一个简单的 Series
a = [1, 2, 3] # dtype: int64
myvar = pd.Series(a)
print(myvar)
print(myvar[1]) # 输出索引为1的数值

2. 指定索引的方式
a = ["Google", "Runoob", "Wiki"]
myvar = pd.Series(a, index = ["x", "y", "z"]) # dtype: object
print(myvar) # x Google y Runoob z Wiki
print(myvar["y"]) # Runoob

3.使用 key/value 对象,类似字典来创建 Series
sites = {1: "Google", 2: "Runoob", 3: "Wiki"} # dtype: object
myvar = pd.Series(sites) 
print(myvar) # 1 Google 2 Runoob 3 Wiki

4. 只需要字典中的一部分数据,只需要指定需要数据的索引即可
sites = {1: "Google", 2: "Runoob", 3: "Wiki"}
myvar = pd.Series(sites, index = [1, 2]) 
print(myvar) # 1 Google 2 Runoob (就指定了索引为1和2的数据)

下图只针对例1进行的截图
在这里插入图片描述

2.3 DataFrame
2.3.1 概念

DataFramepandas 库中的一个数据结构,用于存储和操作二维数据。它可以看作是由多个 Series 组成的表格,其中每个 Series 代表一列数据。有几种方法可以构造一个 DataFrame 对象。
一种方法是使用DataFrame的构造函数,可以通过传入一个二维的数据数组、行索引、列索引、数据类型等参数来创建一个 DataFrame 对象。构造函数的具体用法如下 columns=None, dtype=None, copy=False
 
其中:

  1. data参数是一个二维的数据数组,可以是一个列表、字典或其他数据结构
  2. index参数是行索引,可以是一个列表或其他可迭代对象
  3. columns参数是列索引,也可以是一个列表或其他可迭代对象
  4. dtyp参数是数据类型,用于指定每列的数据类型
  5. copy参数用于指定是否复制数据。

3 Pandas - CSV 文件

CSV(Comma-Separated Values,逗号分隔值,有时也称为字符分隔值,因为分隔字符也可以不是逗号),其文件以纯文本形式存储表格数据(数字和文本)。
CSV 是一种通用的、相对简单的文件格式,被用户、商业和科学广泛应用。

3.1 语法

  1. 读取 csv
import pandas as pd
df = pd.read_csv('test.csv') # 方式一
df = pd.read_csv('test.csv', engine='python') #方式二
print(df) 
  1. 数据输出

to_string() 用于返回 DataFrame 类型的数据,如果不使用该函数,则输出结果为数据的前面 5 行和末尾 5 行,中间部分以 … 代替。

print(df) # 0    0  Peter Parker  Boston Celtics       0  ...  25      62     100    3000
print(df.to_string()) # 0    0  Peter Parker  Boston Celtics       0       PG   25      62     100    3000
  1. 数据储存

使用 to_csv() 方法将 DataFrame 存储为 csv 文件

nme = ["Google", "Runoob", "Taobao", "Wiki"]
st = ["www.google.com", "www.runoob.com", "www.taobao.com", "www.wikipedia.org"]
ag = [90, 40, 80, 98]
# 字典
dict = {'name': nme, 'site': st, 'age': ag}
df = pd.DataFrame(dict)
# 保存 dataframe
df.to_csv('1.csv')

在这里插入图片描述
4. 数据处理 - 读取前几行

head( n ) 方法用于读取前面的 n 行,如果不填参数 n ,默认返回 5

import pandas as pd
df = pd.read_csv('test.csv', engine='python')
print(df.head()) # 默认读取前5行
print('-----------------------')
print(df.head(10)) # 读取前10行
  1. 数据处理 - 读取末尾几行

tail( n ) 方法用于读取尾部的 n 行,如果不填参数 n ,默认返回 5 行,空行各个字段的值返回 NaN

import pandas as pd
df = pd.read_csv('test.csv', engine='python')
print(df.tail()) # 默认末尾5行
print('-----------------------')
print(df.tail(10)) # 读取末尾10行
  1. 返回表格基本信息

info() 方法返回表格的一些基本信息

import pandas as pd
df = pd.read_csv('test.csv', engine='python')
print(df.info())

输出结果如下:
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 51 entries, 0 to 50  # 51行 编号0-50 类似于数组index
Data columns (total 9 columns):  # 9列数据
 #   Column    Non-Null Count  Dtype  # 各列的数据类型
---  ------    --------------  ----- 
 0   No        51 non-null     int64 
 1   Name      51 non-null     object
 2   Team      51 non-null     object
 3   Number    51 non-null     int64 
 4   Position  51 non-null     object
 5   Age       51 non-null     int64 
 6   Height    51 non-null     int64 
 7   Weight    51 non-null     int64 
 8   Salary    51 non-null     int64 
dtypes: int64(6), object(3) # 类型

3.2 遇到的问题

读取csv出现了报错,如下:

read_csv()的参数中加入engine = "python"即可
 
pd.read_csv('my.csv', engine='python')

Traceback (most recent call last):
  File "D:\pycharm\test.py", line 2, in <module>
    df = pd.read_csv('my.csv')
         ^^^^^^^^^^^^^^^^^^^^^
  File "D:\pycharm\venv\Lib\site-packages\pandas\io\parsers\readers.py", line 912, in read_csv
    return _read(filepath_or_buffer, kwds)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "D:\pycharm\venv\Lib\site-packages\pandas\io\parsers\readers.py", line 577, in _read
    parser = TextFileReader(filepath_or_buffer, **kwds)
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "D:\pycharm\venv\Lib\site-packages\pandas\io\parsers\readers.py", line 1407, in __init__
    self._engine = self._make_engine(f, self.engine)
                   ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "D:\pycharm\venv\Lib\site-packages\pandas\io\parsers\readers.py", line 1679, in _make_engine
    return mapping[engine](f, **self.options)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "D:\pycharm\venv\Lib\site-packages\pandas\io\parsers\c_parser_wrapper.py", line 93, in __init__
    self._reader = parsers.TextReader(src, **kwds)
                   ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "pandas\_libs\parsers.pyx", line 557, in pandas._libs.parsers.TextReader.__cinit__
pandas.errors.EmptyDataError: No columns to parse from file

4 Pandas - JSON

4.1 语法

  1. 读取 json 文件
#  test.json
[
   {
   "id": "S001",
   "name": "Lisa",
   "age": 18,
   "hobby": "sing and dance"
   },
   {
   "id": "S002",
   "name": "Rose",
   "age": 17,
   "hobby": "draw pictures"
   },
   {
   "id": "S003",
   "name": Jack"",
   "age": 18,
   "likes": "play basketball"
   }
]

import pandas as pd
df = pd.read_json('test.json')
print(df.to_string())
print('-----------------------')
print(df)

# 输出相同 拿其中一个举例
     id  name  age            hobby
0  S001  Lisa   18   sing and dance
1  S002  Rose   17    draw pictures
2  S003  Jack   18  play basketball 
  1. 处理 json 数据
import pandas as pd
data = [
   {
   "id": "S001",
   "name": "Lisa",
   "age": 18,
   "hobby": "sing and dance"
   },
   {
   "id": "S002",
   "name": "Rose",
   "age": 17,
   "hobby": "draw pictures"
   },
   {
   "id": "S003",
   "name": "Jack",
   "age": 18,
   "hobby": "play basketball"
   }
]
df = pd.DataFrame(data)
print(df)
  1. 内嵌的 json 数据
import pandas as pd
data = [
   {
   "id": "S001",
   "name": "Lisa",
   "age": 18,
   "hobby": [{
     "mostlike" : "read books",
     "morelike" : "sing",
     "like" : "dance"
   }]
   },
   {
   "id": "S002",
   "name": "Rose",
   "age": 17,
   "hobby": "draw pictures"
   },
   {
   "id": "S003",
   "name": "Jack",
   "age": 18,
   "hobby": "play basketball"
   }
]
df = pd.DataFrame(data)
print(df)

# 输出
     id  name  age                                              hobby
0  S001  Lisa   18  [{'mostlike': 'read books', 'morelike': 'sing'...
1  S002  Rose   17                                      draw pictures
2  S003  Jack   18                                    play basketball
  1. 内嵌数据完整 解析
需要遇到一个方法: json_normalize()

test.json
[
   {
   "id": "S001",
   "name": "Lisa",
   "age": 18,
   "hobby": [{
     "mostlike" : "read books",
     "morelike" : "sing",
     "like" : "dance"
   }]},
   {
   "id": "S002",
   "name": "Rose",
   "age": 17,
   "hobby": [{
     "mostlike" : "draw",
     "morelike" : "calligraphy",
     "like" : "mountain climbing"
   }]},
   {
   "id": "S003",
   "name": "Jack",
   "age": 18,
   "hobby": [{
     "mostlike" : "play basketball",
     "morelike" : "play volleyball",
     "like" : "play football"
   }]}
]

import pandas as pd
import json

# 使用 Python JSON 模块载入数据
with open('test.json','r') as f:
    data = json.loads(f.read())

# 展平内嵌数据
df_nested_list = pd.json_normalize(data, record_path =['hobby'])
print(df_nested_list)

输出:
          mostlike         morelike               like
0       read books             sing              dance
1             draw      calligraphy  mountain climbing
2  play basketball  play volleyball      play football

# 展平全部数据 用 meta 这个参数
df_nested_list = pd.json_normalize(
    data,
    record_path =['hobby'],
    meta=['id', 'name' , 'age']
)
print(df_nested_list)

输出:
          mostlike         morelike               like    id  name age
0       read books             sing              dance  S001  Lisa  18
1             draw      calligraphy  mountain climbing  S002  Rose  17
2  play basketball  play volleyball      play football  S003  Jack  18

参考文档

[1] Pandas教程
[2] 菜鸟教程

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值