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