Python第13章复习笔记(Pandas)

Pandas 是一个基于 Python 编程语言的数据处理和分析库,提供了用于快速、灵活、明确地进行数据操作的数据结构。它被广泛应用于数据清洗、数据分析和数据可视化等领域。
安装pandas:pip install pandas

13.1 Pandas 数据结构-Series

Pandas Series 类似于一维数组,可以保存任何数据类型

Series 由索引(index)和列组成,函数如下:
pandas.Series(data,index,dtype,name) 是Pandas中用于创建一维标签数组的构造函数

主要的参数:

  • data: 可以是各种形式的数据,如列表、字典等
  • index: 用于标识数据的索引,可以是整数、标签或其他类型的数据。如果不提供,将默认使用从 0 开始的整数索引
  • dtype: 指定 Series 中元素的数据类型
  • name: Series 的名称
#导入pandas 一般使用别名pd 来代替
import pandas as pd
a = [1, 2, 3]
myvar = pd.Series(a, dtype=float)
print(myvar)
#可以根据索引值来读取数据
print(myvar[1])
#运行结果
0    1.0
1    2.0
2    3.0
dtype: float64
2.0

字符串可以用Python中的str表示,但在Pandas中,字符串数据通常被归类为object类型

import pandas as pd
a=["Google","Runoob","Wiki"]
myvar=pd.Series(a,index=['x','y','z'])
print(myvar)
print(myvar['y'])
#运行结果
x    Google
y    Runoob
z      Wiki
dtype: object
Runoob

希望明确指定数据类型,你可以在创建Series时使用dtype参数
即使你指定了dtype=str,由于Pandas的Series对象是一维的、同质的数据结构,
当你的数据中包含字符串时,Pandas会使用通用的object数据类型

import pandas as pd
a=["Google","Runoob","Wiki"]
myvar=pd.Series(a,index=['x','y','z'],dtype=str)
print(myvar.dtype)
print(myvar)
#运行结果
object
x    Google
y    Runoob
z      Wiki
dtype: object

也可以使用key/value对象 ,类似字典来创建Series字典的key变成了索引值

import pandas as pd
sites={1:"Goole",2:"Runoob",3:"Wiki"}
myvar=pd.Series(sites)
print(myvar)
#运行结果
1     Goole
2    Runoob
3      Wiki
dtype: object

只需要字典中的一部分数据,只需要指定需要数据的索引即可

import pandas as pd
sites={1:"Goole",2:"Runoob",3:"Wiki"}
myvar=pd.Series(sites,index=[1,2],name="Hello")
print(myvar)
#运行结果
1     Goole
2    Runoob
Name: Hello, dtype: object

13.2 Pandas 数据结构-DataFrame

DataFrame 是一个表格型的数据结构,它含有一组有序的列,每列可以是不同的值类型(数值、字符串、布尔型值)。DataFrame 既有行索引也有列索引,它可以被看做由 Series 组成的字典(共同用一个索引)。
在这里插入图片描述
在这里插入图片描述
DataFrame构造方法如下:
pandas.DataFrame( data, index, columns, dtype)

  • data:这是 DataFrame 中包含的数据,它可以是多种形式
  • index: DataFrame 的行索引,表示每行的标签。它可以是数组、列表等数据结构。默认会创建一个从 0 开始的整数索引
  • columns:DataFrame 的列名,表示每列的标签。它可以是列名列表、数组、元组等数据结构。默认会创建一个从 0 开始的整数列名
  • dtype:这是可选参数,用于指定 DataFrame 中数据的数据类型
import pandas as pd
#使用列表创建
data=[['Goole',10],['Runoob',12],['Wiki',13]]
df=pd.DataFrame(data,columns=['Site','Age'])
print(df.dtypes)
print(df)
#运行结果
Site    object
Age      int64
dtype: object
     Site  Age
0   Goole   10
1  Runoob   12
2    Wiki   13

使用字典来创建DataFrame的列名是由数据中的字典的键决定的。每个字典的键被解释为DataFrame 中的列名。

import pandas as pd
data={'a':[1,10,50],'b':[2,10,60],'c':[20,70,None]}
#没有对应的部分数据为NaN  NaN 表示 "Not a Number",是在数据分析和处理中表示缺失值或不可用数据的一种标记。
df=pd.DataFrame(data)
print(df)
#运行结果
    a   b     c
0   1   2  20.0
1  10  10  70.0
2  50  60   NaN

Pandas可以使用loc属性返回指定行的数据,第一行索引为0,第二行索引为1返回结果是一个Pandas Series数据

import pandas as pd
data={'a':[1,10,50],'b':[2,10,60],'c':[20,70,None]}
df=pd.DataFrame(data)
print(df)
print(df.loc[0])
print(df.loc[1])
#运行结果
    a   b     c
0   1   2  20.0
1  10  10  70.0
2  50  60   NaN
a     1.0
b     2.0
c    20.0
Name: 0, dtype: float64
a    10.0
b    10.0
c    70.0
Name: 1, dtype: float64

loc属性也可以返回多行数据,使用[[ … ]]格式…为各行的索引,以逗号隔开

import pandas as pd
data={'a':[1,10,50],'b':[2,10,60],'c':[20,70,None]}
df=pd.DataFrame(data)
print(df)
print(df.loc[[0, 1]])
#运行结果
    a   b     c
0   1   2  20.0
1  10  10  70.0
2  50  60   NaN
    a   b     c
0   1   2  20.0
1  10  10  70.0

13.3 Pandas CSV文件

  • CSV文件以纯文本形式存储表格数据(数字和文本)
  • CSV 是一种通用的、相对简单的文件格式,被用户、商业和科学广泛应用
  • Pandas 可以很方便的处理 CSV 文件

read_csv是Pandas库中的一个函数,用于从CSV文件中读取数据并创建一个DataFrame对象

import pandas as pd
df=pd.read_csv('nba.csv')
# to_string() 用于返回DataFrame类型的数据,如果不使用该函数,则输出结果为数据的前面 5 行和末尾 5 行,中间部分以 ... 代替。
#print(df.to_string())
print(df)
#运行结果
              Name            Team  ...            College     Salary
0    Avery Bradley  Boston Celtics  ...              Texas  7730337.0
1      Jae Crowder  Boston Celtics  ...          Marquette  6796117.0
2     John Holland  Boston Celtics  ...  Boston University        NaN
3      R.J. Hunter  Boston Celtics  ...      Georgia State  1148640.0
4    Jonas Jerebko  Boston Celtics  ...                NaN  5000000.0
..             ...             ...  ...                ...        ...
453   Shelvin Mack       Utah Jazz  ...             Butler  2433333.0
454      Raul Neto       Utah Jazz  ...                NaN   900000.0
455   Tibor Pleiss       Utah Jazz  ...                NaN  2900000.0
456    Jeff Withey       Utah Jazz  ...             Kansas   947276.0
457            NaN             NaN  ...                NaN        NaN

使用 to_csv() 方法将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)
#保存 dataframe
df.to_csv('site.csv')
print(df)
#运行结果
     name               site  age
0  Google     www.google.com   90
1  Runoob     www.runoob.com   40
2  Taobao     www.taobao.com   80
3    Wiki  www.wikipedia.org   98

site.csv如下所示:
在这里插入图片描述
数据处理 df.head() df.tail() df.info() 方法返回表格的一些基本信息

  • head(n)方法用于读取前面的n行,如果不填参数n,默认返回5行。
  • tail(n)方法用于读取尾部的n行,如果不填参数n,默认返回5行,空行各个字段的值返回NaN。
  • info()方法返回表格的一些基本信息
import pandas as pd
df=pd.read_csv('nba.csv')
print(df.head())
print(df.head(10))
print(df.tail())
print(df.tail(10))
print(df.info())
#运行结果
            Name            Team  Number  ... Weight            College     Salary
0  Avery Bradley  Boston Celtics     0.0  ...  180.0              Texas  7730337.0
1    Jae Crowder  Boston Celtics    99.0  ...  235.0          Marquette  6796117.0
2   John Holland  Boston Celtics    30.0  ...  205.0  Boston University        NaN
3    R.J. Hunter  Boston Celtics    28.0  ...  185.0      Georgia State  1148640.0
4  Jonas Jerebko  Boston Celtics     8.0  ...  231.0                NaN  5000000.0

[5 rows x 9 columns]
            Name            Team  Number  ... Weight            College      Salary
0  Avery Bradley  Boston Celtics     0.0  ...  180.0              Texas   7730337.0
1    Jae Crowder  Boston Celtics    99.0  ...  235.0          Marquette   6796117.0
2   John Holland  Boston Celtics    30.0  ...  205.0  Boston University         NaN
3    R.J. Hunter  Boston Celtics    28.0  ...  185.0      Georgia State   1148640.0
4  Jonas Jerebko  Boston Celtics     8.0  ...  231.0                NaN   5000000.0
5   Amir Johnson  Boston Celtics    90.0  ...  240.0                NaN  12000000.0
6  Jordan Mickey  Boston Celtics    55.0  ...  235.0                LSU   1170960.0
7   Kelly Olynyk  Boston Celtics    41.0  ...  238.0            Gonzaga   2165160.0
8   Terry Rozier  Boston Celtics    12.0  ...  190.0         Louisville   1824360.0
9   Marcus Smart  Boston Celtics    36.0  ...  220.0     Oklahoma State   3431040.0

[10 rows x 9 columns]
             Name       Team  Number Position  ...  Height Weight  College     Salary
453  Shelvin Mack  Utah Jazz     8.0       PG  ...     6-3  203.0   Butler  2433333.0
454     Raul Neto  Utah Jazz    25.0       PG  ...     6-1  179.0      NaN   900000.0
455  Tibor Pleiss  Utah Jazz    21.0        C  ...     7-3  256.0      NaN  2900000.0
456   Jeff Withey  Utah Jazz    24.0        C  ...     7-0  231.0   Kansas   947276.0
457           NaN        NaN     NaN      NaN  ...     NaN    NaN      NaN        NaN

[5 rows x 9 columns]
               Name       Team  Number  ... Weight   College      Salary
448  Gordon Hayward  Utah Jazz    20.0  ...  226.0    Butler  15409570.0
449     Rodney Hood  Utah Jazz     5.0  ...  206.0      Duke   1348440.0
450      Joe Ingles  Utah Jazz     2.0  ...  226.0       NaN   2050000.0
451   Chris Johnson  Utah Jazz    23.0  ...  206.0    Dayton    981348.0
452      Trey Lyles  Utah Jazz    41.0  ...  234.0  Kentucky   2239800.0
453    Shelvin Mack  Utah Jazz     8.0  ...  203.0    Butler   2433333.0
454       Raul Neto  Utah Jazz    25.0  ...  179.0       NaN    900000.0
455    Tibor Pleiss  Utah Jazz    21.0  ...  256.0       NaN   2900000.0
456     Jeff Withey  Utah Jazz    24.0  ...  231.0    Kansas    947276.0
457             NaN        NaN     NaN  ...    NaN       NaN         NaN

[10 rows x 9 columns]
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 458 entries, 0 to 457
Data columns (total 9 columns):
 #   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 
 8   Salary    446 non-null    float64
dtypes: float64(4), object(5)
memory usage: 32.3+ KB
None

13.4 Pandas数据清洗

数据清洗是对一些没有用的数据进行处理的过程。很多数据集存在数据缺失、数据格式错误、错误数据或重复数据的情况,如果要使数据分析更加准确,就需要对这些没有用的数据进行处理。我们可以利用 Pandas包来进行数据清洗

13.4.1 dropna() 方法

如果我们要删除包含空字段的行,可以使用 dropna() 方法,语法格式如下
DataFrame.dropna(axis=0, how=‘any’, inplace=False)
默认情况下,dropna() 方法删除包含任何缺失值的行

主要参数:

  • axis:默认为0,表示逢空值剔除整行,如果设置参数 axis=1 表示逢空值去掉整列。
  • how:默认为 ‘any’ 如果一行(或一列)里任何一个数据有出现NA就去掉整行,如果设置how=‘all’
    一行(或列)都是NA才去掉这整行。
import pandas as pd
# property-data.csv包含了四种空数据:n/a  NA  -—  na
# isnull() 判断各个单元格是否为空。
df=pd.read_csv("property-data.csv")
print(df)
print (df['NUM_BEDROOMS'])
print (df['NUM_BEDROOMS'].isnull())
#运行结果
           PID  ST_NUM     ST_NAME OWN_OCCUPIED NUM_BEDROOMS NUM_BATH SQ_FT
0  100001000.0   104.0      PUTNAM            Y            3        1  1000
1  100002000.0   197.0   LEXINGTON            N            3      1.5    --
2  100003000.0     NaN   LEXINGTON            N          NaN        1   850
3  100004000.0   201.0    BERKELEY           12            1      NaN   700
4          NaN   203.0    BERKELEY            Y            3        2  1600
5  100006000.0   207.0    BERKELEY            Y          NaN        1   800
6  100007000.0     NaN  WASHINGTON          NaN            2   HURLEY   950
7  100008000.0   213.0     TREMONT            Y            1        1   NaN
8  100009000.0   215.0     TREMONT            Y           na        2  1800
0      3
1      3
2    NaN
3      1
4      3
5    NaN
6      2
7      1
8     na
Name: NUM_BEDROOMS, dtype: object
0    False
1    False
2     True
3    False
4    False
5     True
6    False
7    False
8    False
Name: NUM_BEDROOMS, dtype: bool

以上例子中我们看到Pandas把n/a和NA当作空数据,na不是空数据,不符合我们要求,我们可以指定空数据类型

na_values 参数是用来指定在读取数据时应该被识别为缺失值的值。换句话说,当读取数据时,na_values 参数允许你指定哪些值应该被视为缺失值(NaN)。NaN 通常表示空数据或缺失值(Not a Number)

import pandas as pd
missing_values = ["n/a", "na", "--"]
df = pd.read_csv('property-data.csv', na_values = missing_values)
print (df['NUM_BEDROOMS'])
print (df['NUM_BEDROOMS'].isnull())
#运行结果
0    3.0
1    3.0
2    NaN
3    1.0
4    3.0
5    NaN
6    2.0
7    1.0
8    NaN
Name: NUM_BEDROOMS, dtype: float64
0    False
1    False
2     True
3    False
4    False
5     True
6    False
7    False
8     True
Name: NUM_BEDROOMS, dtype: bool

接下来的实例演示了删除包含空数据的行 默认情况下,dropna() 方法删除包含任何缺失值的行,但你也可以通过参数进行更多的定制。

import pandas as pd
missing_values = ["n/a","na","--"]
df = pd.read_csv('property-data.csv', na_values = missing_values)
df.dropna(inplace = True)
print(df.to_string())
#运行结果
           PID  ST_NUM ST_NAME OWN_OCCUPIED  NUM_BEDROOMS NUM_BATH   SQ_FT
0  100001000.0   104.0  PUTNAM            Y           3.0        1  1000.0

默认情况下,dropna()方法返回一个新的DataFrame,不会修改源数据。
如果你要修改源数据 DataFrame, 可以使用inplace = True参数

13.4.2 Pandas清洗格式错误数据

1、数据格式错误的单元格会使数据分析变得困难,甚至不可能。

我们可以通过包含空单元格的行,或者将列中的所有单元格转换为相同格式的数据。

以下实例会格式化日期:

# 第三个日期格式错误
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"])
#调用 Pandas 的 to_datetime 函数,它用于将输入的日期数据转换为 Pandas 的日期时间格式
df['Date'] = pd.to_datetime(df['Date'])
print(df.to_string())
#运行结果
           Date  duration
day1 2020-12-01        50
day2 2020-12-02        40
day3 2020-12-26        45

2、Pandas清洗错误数据

数据错误也是很常见的情况,我们可以对错误的数据进行替换或移除。

以下实例会替换错误年龄的数据:

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())
#运行结果
     name  age
0  Google   50
1  Runoob   40
2  Taobao   30

3、Pandas清洗重复数据

如果我们要清洗重复数据,可以使用duplicated()和drop_duplicates()方法。

如果对应的数据是重复的,duplicated()会返回True,否则返回False。

import pandas as pd
person = {
  "name": ['Google', 'Runoob', 'Runoob', 'Taobao'],
  "age": [50, 40, 40, 23]
}
df = pd.DataFrame(person)
print(df.to_string)
print(df.duplicated())
#运行结果
<bound method DataFrame.to_string of
     name  age
0  Google   50
1  Runoob   40
2  Runoob   40
3  Taobao   23>
0    False
1    False
2     True
3    False
dtype: bool

删除重复数据,可以直接使用drop_duplicates()方法

import pandas as pd
persons = {
  "name": ['Google', 'Runoob', 'Runoob', 'Taobao'],
  "age": [50, 40, 40, 23]
}
df = pd.DataFrame(persons)
df.drop_duplicates(inplace = True)
print(df)
#运行结果
<bound method DataFrame.to_string of
     name  age
0  Google   50
1  Runoob   40
3  Taobao   23
  • 29
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

The square of H

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值