概述

Pyanda是python的一个扩展程序库,用于数据分析

Pandas 应用
Pandas 的主要数据结构是 Series (一维数据)与 DataFrame(二维数据),这两种数据结构足以处理金融、统计、社会科学、工程等领域里的大多数典型用例。

数据结构
Series 是一种类似于一维数组的对象,它由一组数据(各种Numpy数据类型)以及一组与之相关的数据标签(即索引)组成。
DataFrame 是一个表格型的数据结构,它含有一组有序的列,每列可以是不同的值类型(数值、字符串、布尔型值)。DataFrame 既有行索引也有列索引,它可以被看做由 Series 组成的字典(共同用一个索引)。

安装

  1. pip install pandas

Pandas 数据结构—-Series

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

pandas.Series(data,index,dtype,name,copy)

参数说明:

  • data:一组数据(ndarray 类型)。
  • index:数据索引标签,如果不指定,默认从 0 开始。
  • dtype:数据类型,默认会自己判断。
  • name:设置名称。
  • copy:拷贝数据,默认为 False。 ```python import pandas as pd

a = [1, 2, 3]

myvar = pd.Series(a)

print(myvar)

  1. ![](https://cdn.nlark.com/yuque/0/2022/jpeg/1389621/1656827254778-f97203d5-eb5a-459e-8328-aa17b49e83bb.jpeg#clientId=ube53313a-b701-4&crop=0&crop=0&crop=1&crop=1&from=paste&id=ue6fdf1e9&margin=%5Bobject%20Object%5D&originHeight=346&originWidth=758&originalType=url&ratio=1&rotation=0&showTitle=false&status=done&style=none&taskId=u47dfdf6f-e66c-4039-954d-6a2bdf02b6f&title=)
  2. ```python
  3. print(myvar[1])

输出结果如下:
2

为Series指定索引值:

  1. import pandas as pd
  2. a = ["Google", "Runoob", "Wiki"]
  3. myvar = pd.Series(a, index = ["x", "y", "z"])
  4. print(myvar)

x Google
y Runoob
z Wiki
dtype: object

我们也可以使用 key/value 对象,类似字典来创建 Series:

  1. import pandas as pd
  2. sites = {1: "Google", 2: "Runoob", 3: "Wiki"}
  3. myvar = pd.Series(sites)
  4. print(myvar)

1 Google
2 Runoob
3 Wiki
dtype: object
可见,字典的key就成了索引值

设置Series 名称参数

import pandas as pd

sites = {1: "Google", 2: "Runoob", 3: "Wiki"}

myvar = pd.Series(sites, index = [1, 2], name="RUNOOB-Series-TEST" )

print(myvar)

Pandas 基础 - 图1

Pandas 数据结构—-DataFrame

DataFrame 是一个表格型的数据结构,它含有一组有序的列,每列可以是不同的值类型(数值、字符串、布尔型值)。DataFrame 既有行索引也有列索引,它可以被看做由 Series 组成的字典(共同用一个索引)。
Pandas 基础 - 图2
Pandas 基础 - 图3

构造:

pandas.DataFrame( data, index, columns, dtype, copy)

参数说明:

  • data:一组数据(ndarray、series, map, lists, dict 等类型)。
  • index:索引值,或者可以称为行标签。
  • columns:列标签,默认为 RangeIndex (0, 1, 2, …, n) 。
  • dtype:数据类型。
  • copy:拷贝数据,默认为 False。

使用列表创建

import pandas as pd

data = [['Google',10],['Runoob',12],['Wiki',13]]

df = pd.DataFrame(data,columns=['Site','Age'],dtype=float)

print(df)
 Site   Age<br />0  Google  10.0<br />1  Runoob  12.0<br />2    Wiki  13.0

使用ndarrays 创建

import pandas as pd

data = {'Site':['Google', 'Runoob', 'Wiki'], 'Age':[10, 12, 13]}

df = pd.DataFrame(data)

print (df)
 Site  Age<br />0  Google   10<br />1  Runoob   12<br />2    Wiki   13<br />从以上输出结果可以知道, DataFrame 数据类型一个表格,包含 rows(行) 和 columns(列):<br />![](https://cdn.nlark.com/yuque/0/2022/png/1389621/1656827759298-12c012d5-80e6-4e3f-89e6-c8634d455830.png#clientId=ub6f9b83a-121b-4&crop=0&crop=0&crop=1&crop=1&from=paste&id=u871709d3&margin=%5Bobject%20Object%5D&originHeight=160&originWidth=316&originalType=url&ratio=1&rotation=0&showTitle=false&status=done&style=none&taskId=u37e3efdd-1d5e-40b9-a120-6d6360d898b&title=)

还可以使用字典(key/value),其中字典的 key 为列名:

import pandas as pd

data = [{'a': 1, 'b': 2},{'a': 5, 'b': 10, 'c': 20}]

df = pd.DataFrame(data)

print (df)
a   b     c <br />0  1   2   NaN<br />1  5  10  20.0

Pandas 可以使用 loc 属性返回指定行的数据,如果没有设置索引,第一行索引为 0,第二行索引为 1,以此类推:

import pandas as pd

data = {
  "calories": [420, 380, 390],
  "duration": [50, 40, 45]
}

# 数据载入到 DataFrame 对象
df = pd.DataFrame(data)
print(df)

# 返回第一行
print(df.loc[0])
# 返回第二行
print(df.loc[1])

calories duration
0 420 50
1 380 40
2 390 45
calories 420
duration 50
Name: 0, dtype: int64
calories 380
duration 40
Name: 1, dtype: int64

返回多行数据

import pandas as pd

data = {
  "calories": [420, 380, 390],
  "duration": [50, 40, 45]
}

# 数据载入到 DataFrame 对象
df = pd.DataFrame(data)
print(df)

# 返回第一行和第二行
print(df.loc[[0, 1]])

calories duration
0 420 50
1 380 40
2 390 45
calories duration
0 420 50
1 380 40

Pandas CSV文件

CSV :comma-separated values,都好分隔值

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

读取文件

import pandas as pd
df = pd.read("nba.csv")
print(df)
print(df.to_string())

to_string() 用于返回 DataFrame 类型的数据,如果不使用该函数,则输出结果为数据的前面 5 行和末尾 5 行,中间部分以 代替。
Name Team Number Position Age Height Weight College Salary
0 Avery Bradley Boston Celtics 0.0 PG 25.0 6-2 180.0 Texas 7730337.0
1 Jae Crowder Boston Celtics 99.0 SF 25.0 6-6 235.0 Marquette 6796117.0
2 John Holland Boston Celtics 30.0 SG 27.0 6-5 205.0 Boston University NaN
3 R.J. Hunter Boston Celtics 28.0 SG 22.0 6-5 185.0 Georgia State 1148640.0
4 Jonas Jerebko Boston Celtics 8.0 PF 29.0 6-10 231.0 NaN 5000000.0
.. … … … … … … … … …
453 Shelvin Mack Utah Jazz 8.0 PG 26.0 6-3 203.0 Butler 2433333.0
454 Raul Neto Utah Jazz 25.0 PG 24.0 6-1 179.0 NaN 900000.0
455 Tibor Pleiss Utah Jazz 21.0 C 26.0 7-3 256.0 NaN 2900000.0
456 Jeff Withey Utah Jazz 24.0 C 26.0 7-0 231.0 Kansas 947276.0
457 NaN NaN NaN NaN NaN NaN NaN NaN NaN

将dataframe存储为csv文件

import pandas as pd

# 三个字段 name, site, age
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)

df.to_csv('site.csv')

image.png

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

数据处理

head()

head(n)方法用于读取前n行,如果没有参数n,则默认返回5行

import pandas as pd

df = pd.read_csv("nba.csv")

print(df.head(3))
print(df.head())
        Name            Team  Number Position   Age Height  Weight            College     Salary<br />0  Avery Bradley  Boston Celtics     0.0       PG  25.0    6-2   180.0              Texas  7730337.0<br />1    Jae Crowder  Boston Celtics    99.0       SF  25.0    6-6   235.0          Marquette  6796117.0<br />2   John Holland  Boston Celtics    30.0       SG  27.0    6-5   205.0  Boston University        NaN<br />            Name            Team  Number Position   Age Height  Weight            College     Salary<br />0  Avery Bradley  Boston Celtics     0.0       PG  25.0    6-2   180.0              Texas  7730337.0<br />1    Jae Crowder  Boston Celtics    99.0       SF  25.0    6-6   235.0          Marquette  6796117.0<br />2   John Holland  Boston Celtics    30.0       SG  27.0    6-5   205.0  Boston University        NaN<br />3    R.J. Hunter  Boston Celtics    28.0       SG  22.0    6-5   185.0      Georgia State  1148640.0<br />4  Jonas Jerebko  Boston Celtics     8.0       PF  29.0   6-10   231.0                NaN  5000000.0

tail()

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

import pandas as pd

df = pd.read_csv("nba.csv")

print(df.tail(3))
print(df.tail())
         Name       Team  Number Position   Age Height  Weight College     Salary<br />455  Tibor Pleiss  Utah Jazz    21.0        C  26.0    7-3   256.0     NaN  2900000.0<br />456   Jeff Withey  Utah Jazz    24.0        C  26.0    7-0   231.0  Kansas   947276.0<br />457           NaN        NaN     NaN      NaN   NaN    NaN     NaN     NaN        NaN<br />             Name       Team  Number Position   Age Height  Weight College     Salary<br />453  Shelvin Mack  Utah Jazz     8.0       PG  26.0    6-3   203.0  Butler  2433333.0<br />454     Raul Neto  Utah Jazz    25.0       PG  24.0    6-1   179.0     NaN   900000.0<br />455  Tibor Pleiss  Utah Jazz    21.0        C  26.0    7-3   256.0     NaN  2900000.0<br />456   Jeff Withey  Utah Jazz    24.0        C  26.0    7-0   231.0  Kansas   947276.0<br />457           NaN        NaN     NaN      NaN   NaN    NaN     NaN     NaN        NaN

info()

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

import pandas as pd

df = pd.read_csv("nba.csv")

print(df.info())


RangeIndex: 458 entries, 0 to 457 # 行数,458 行,第一行编号为 0
Data columns (total 9 columns): # 列数,9列
# Column Non-Null Count Dtype # 各列的数据类型 —- ——— ——————— ——-
0 Name 457 non-null object
1 Team 457 non-null object
2 Number 457 non-null float64
3 Position 457 non-null object
4 Age 457 non-null float64
5 Height 457 non-null object
6 Weight 457 non-null float64
7 College 373 non-null object # non-null,意思为非空的数据
8 Salary 446 non-null float64
dtypes: float64(4), object(5) # 类型

Pandas JSON

JSON(JavaScript Object Notation,JavaScript 对象表示法),是存储和交换文本信息的语法,类似 XML。

import pandas as pd

df = pd.read_json('sites.json')

print(df.to_string())

数据清洗

Pandas清洗空值

如果我们要删除包含空字段的行,可以使用 dropna() 方法,语法格式如下:
DataFrame.dropna(axis=0, how=’any’, thresh=None, subset=None, inplace=False)
参数说明:

  • axis:默认为 0,表示逢空值剔除整行,如果设置参数 axis=1 表示逢空值去掉整列。
  • how:默认为 ‘any’ 如果一行(或一列)里任何一个数据有出现 NA 就去掉整行,如果设置 how=’all’ 一行(或列)都是 NA 才去掉这整行。
  • thresh:设置需要多少非空值的数据才可以保留下来的。
  • subset:设置想要检查的列。如果是多个列,可以使用列名的 list 作为参数。
  • inplace:如果设置 True,将计算得到的值直接覆盖之前的值并返回 None,修改的是源数据。

    Pandas 清洗格式错误数据

    ```python import pandas as pd

第三个日期格式错误

data = { “Date”: [‘2020/12/01’, ‘2020/12/02’ , ‘20201226’], “duration”: [50, 40, 45] }

df = pd.DataFrame(data, index = [“day1”, “day2”, “day3”])

df[‘Date’] = pd.to_datetime(df[‘Date’])

print(df.to_string())

<a name="d9wOW"></a>
### Pandas 清洗错误数据
```python
import pandas as pd

person = {
  "name": ['Google', 'Runoob' , 'Taobao'],
  "age": [50, 40, 12345]    # 12345 年龄数据是错误的
}

df = pd.DataFrame(person)

df.loc[2, 'age'] = 30 # 修改数据

print(df.to_string())

Pandas 清洗重复数据

如果我们要清洗重复数据,可以使用 duplicated()drop_duplicates() 方法。
如果对应的数据是重复的,duplicated() 会返回 True,否则返回 False。