欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

Python数据分析常用库-pandas库基础操作

程序员文章站 2023-12-24 19:17:51
目录Pandas两大数据结构Series序列创建序列序列的属性序列基本操作DataFrame数据框创建DataFrameDataFrame的属性Pandas基础操作文件数据读取与存储数据读取数据存储Pandas是一个强大的分析结构化数据的工具集;它的使用基础是Numpy(提供高性能的矩阵运算);用于数据挖掘和数据分析,同时也提供数据清洗功能。Pandas两大数据结构Series序列它是一种类似于一维数组的对象,是由一组数据(各种NumPy数据类...

目录

Pandas两大数据结构

Series序列

创建序列

序列的属性

序列基本操作

DataFrame数据框

创建DataFrame

DataFrame的属性

Pandas基础操作

文件数据读取与存储

数据读取

数据存储

数据筛选

常用方法

条件查询函数

增删改数据

新增列

删除数据

修改数据


Pandas是一个强大的分析结构化数据的工具集;它的使用基础是Numpy(提供高性能的矩阵运算);用于数据挖掘和数据分析,同时也提供数据清洗功能。

pandas中文网:https://www.pypandas.cn/

本文中用到的数据来源于kaggle.com/datasets

Pandas两大数据结构

Series序列

它是一种类似于一维数组的对象,是由一组数据(各种NumPy数据类型)以及一组与之相关的数据标签(即索引)组成。

仅由一组数据也可产生简单的Series对象。

创建序列

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

参数

说明

data

序列的值。可以是列表、字典或者numpy中的数组。

index

序列的索引。不指定索引时,默认会生成一列从0开始的整数作为索引

dtype

元素类型

name

指定序列名称

示例:

# 创建一个series对象,不指定索引时会自动创建索引
s1 = pd.Series([1, 2, 3, 4, 5, 6])
print(type(s1))
# <class 'pandas.core.series.Series'>
print(s1)
# 0 1
# 1 2
# 2 3
# 3 4
# 4 5
# 5 6
# dtype: int64

# 使用字典创建序列
s1 = pd.Series({"a":11, "b":21, "c":31})
print(s1)
# dtype: int64
# a  11
# b  21
# c  31
# dtype: int64

序列的属性

print("-" * 16, "序列的属性", "-" * 16)
print(1, s1.index)    # Index(['a', 'b', 'c'], dtype='object')
print(2, s1.values)    # [11 21 31]
print(3, s1.dtypes, s1.dtype)    # int64 int64
print(4, s1.shape)    # (3,)
print(5, s1.ndim)    # 1
print(6, s1.size)    # 3

序列基本操作

1、访问序列元素

① 通过int型索引访问。遵守python的左闭右开区间原则。

s1 = pd.Series({"a":11, "b":21, "c":31})
print(s1[0:2]) 
# a 11
# b 21
# dtype: int64

② 通过非int型索引访问。不遵守左闭右开原则,区间右端的数据也能访问到

s1 = pd.Series({"a":11, "b":21, "c":31})
print(s1["a":"c"])
# a 11
# b 21
# c 31
# dtype: int64

2、序列追加数据

append函数。返回两个序列拼接成的新序列,不会修改原序列。

s2 = pd.Series({"c":4, "d":5})
print(s1.append(s2))    # 
# a 11
# b 21
# c 31
# c 4
# d 5
# dtype: int64
print(s1)
# a 11
# b 21
# c 31
# dtype: int64

3、修改序列的值

print("-" * 16, "修改序列的值", "-" * 16)
s1["a"] = 111    
print(s1["a"])    # 111

4、删除序列中数据

drop函数。

  • 返回删除数据后的新序列,不会修改原序列。
  • 可通过inplace参数指定是否修改原序列。
print("-" * 16, "删除序列中的数据", "-" * 16)
print(s1.drop(["a", "b"]).values)    # 31
print(s1.values)    # [111  21  31]

DataFrame数据框

DataFrame是Pandas中的一个表格型的数据结构,类似于二维数组,包含有一组有序的列,每列可以是不同的值类型(数值、字符串、布尔型等)。

DataFrame即有行索引也有列索引,可以被看做是由Series组成的字典。

创建DataFrame

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

参数名称

说明

data

可以是列表、字典或者numpy中的数组。

index

行索引

columns

列名称

# 通过列表创建DataFrame
data = [["vivian", "女", 18], ["peter", "男", 20], ["lily", "女", 19]]
cols = ["name", "sex", "age"]
df1 = pd.DataFrame(data, columns=cols)
print(df1)
#     name   sex age
# 0   vivian  女  18
# 1    peter  男  20
# 2     lily  女  19
# 通过字典创建DataFrame,字典键会转化为列名称
data2 = {"name":["vivian", "peter", "lily"],
         "sex":["女", "男", "女"],
         "age":[18, 20, 19]}
df2 = pd.DataFrame(data2)
print(df2)
#     name   sex age
# 0   vivian  女  18
# 1    peter  男  20
# 2     lily  女  19

DataFrame的属性

属性名称

说明

values

DataFrame的所有的数据

index

DataFrame的索引

columns

DataFrame的列名称

shape

形状

ndim

维度

dtypes

每列的数据类型

size

元素个数

Pandas基础操作

文件数据读取与存储

数据读取

pandas会把数据读到DataFrame中。

1、read_csv函数

2、read_excel函数

常用参数说明:

filepath:文件路径

encoding:指定编码格式

dtype:按列指定数据类型。类型名称或者列名-->类型名称组成的字典。

nrows:指定需要读取的行数(不包括表头)

sep:指定分隔符。默认是逗号。

na_values:指定用于填充缺失值的数据,可以是字符串、列表或者字典。默认情况下,以下值被认为是缺失值(空值):'', '#N/A', '#N/A N/A', '#NA', '-1.#IND', '-1.#QNAN', '-NaN', '-nan', '1.#IND', '1.#QNAN', '<NA>', 'N/A', 'NA', 'NULL', 'NaN', 'n/a', 'nan', 'null'

header:指定表头所在的行数(从0开始计数)。

df = pd.read_csv("data/cholera_data.csv", encoding="utf-8", header=0, na_values={"Cholera case fatality rate":0}, dtype={"Country":str}, nrows=100, sep=",") print(df.shape) print(df.dtypes) print(df.head(10)) # 获取前10行数据 print(df.tail(5)) # 获取前5行数据

sheet_name:工作表名称,可以是字符串或列表。read_excel函数才有此参数。

df = pd.read_csv("data/cholera_data.csv", encoding="utf-8", header=0,
                 na_values={"Cholera case fatality rate":0},
                 dtype={"Country":str}, nrows=100, sep=",")
print(df.shape)
print(df.dtypes)
print(df.head(10))    # 获取前10行数据
print(df.tail(5))    # 获取前5行数据

数据存储

1、to_csv函数 数据写入csv文件

2、to_excel函数 数据写入excel文件

常用参数说明:

filepath:文件路径

index:指定是否写入索引。

encoding:指定编码格式

df.to_excel("data/cholera_data.xlsx", index=False)

数据筛选

常用方法

以下代码中df对象都是读取自“cholera_data.csv”文件。

import pandas as pd
df = pd.read_csv("data/cholera_data.csv", nrows=100)

1、中括号访问:df[a]、df[a][b]

中括号内只接受一个参数,可以是行索引、列标签或布尔表达式。

① 单个行索引或行索引切片。筛选出指定行的数据。

# 通过行索引访问
print(df[:3])
#            Country  Year  ...  Cholera case fatality rate             WHO Region
# 0  Afghanistan  2016  ...                        0.70  Eastern Mediterranean
# 1  Afghanistan  2015  ...                        0.01  Eastern Mediterranean
# 2  Afghanistan  2014  ...                         NaN  Eastern Mediterranean
#
# [3 rows x 6 columns]

② 单个列标签或列标签列表。筛选出指定列的数据。

# 单个列标签
print(df['Country'])    # 等价于 print(df.Country)
#     0     Afghanistan
# 1     Afghanistan
# 2     Afghanistan
# 3     Afghanistan
# 4     Afghanistan
#          ...
# 95      Australia
# 96      Australia
# 97      Australia
# 98      Australia
# 99      Australia
# Name: Country, Length: 100, dtype: object

print("列类型:", type(df.Country))
# 列类型: <class 'pandas.core.series.Series'>

# 选择多列数据
print(df[['Country','Year']])
#             Country  Year
# 0   Afghanistan  2016
# 1   Afghanistan  2015
# 2   Afghanistan  2014
# 3   Afghanistan  2013
# 4   Afghanistan  2012
# ..          ...   ...
# 95    Australia  1994
# 96    Australia  1993
# 97    Australia  1992
# 98    Australia  1988
# 99    Australia  1987
#
# [100 rows x 2 columns]

③ 布尔表达式

print(df[(df['Year'] == 2016)])
#             Country  Year  ...  Cholera case fatality rate             WHO Region
# 0   Afghanistan  2016  ...                         0.7  Eastern Mediterranean
# 43       Angola  2016  ...                         3.8                 Africa
# 76    Australia  2016  ...                         0.0        Western Pacific

df[a][b] 表示先按照条件a筛选数据,再从结果中按照条件b筛选数据。

a:列标签或布尔表达式,b:行索引。

print(df[(df['Year'] == 2016)][:2])
#             Country  Year  ...  Cholera case fatality rate             WHO Region
# 0   Afghanistan  2016  ...                         0.7  Eastern Mediterranean
# 43       Angola  2016  ...  

2、loc方法:df.loc[a, b]

中括号内接受两个参数,参数可以是行列标签或布尔表达式,第1个参数表示行,第2个参数表示列(第2个参数可省略)。

① 单个行(列)标签。

print(df.loc[3,'Country'])   # Afghanistan
print(df.loc[3])   # 省略第2个参数,访问第3行数据
print(df.loc[:, 'Country'])   # 访问Country列的数据

② 行标签切片。标签不遵守左闭右开原则。

print(df.loc[0:2])    # 标签不遵守左闭右开原则
#         Country  Year  ...  Cholera case fatality rate             WHO Region
# 0  Afghanistan  2016  ...                        0.70  Eastern Mediterranean
# 1  Afghanistan  2015  ...                        0.01  Eastern Mediterranean
# 2  Afghanistan  2014  ...                         NaN  Eastern Mediterranean
# [3 rows x 6 columns]

③ 行(列)标签列表

print(df.loc[[0, 2], ['Country', 'Year']])
#     Country  Year
# 0  Afghanistan  2016
# 2  Afghanistan  2014

④ 布尔表达式(只有第一个参数可以接受布尔表达式)

print(df.loc[df['Year']==2016, ['Country', 'Year']])
#          Country  Year
# 0   Afghanistan  2016
# 43       Angola  2016
# 76    Australia  2016

3、iloc方法:df.iloc[a, b]

接受两个参数,两个参数都是索引值。可以是单个索引值、索引列表或索引切片。

print(df.iloc[:4, :3])    # 返回前4行前3列数据
#             Country  Year  Number of reported cases of cholera
# 0  Afghanistan  2016                                  677
# 1  Afghanistan  2015                                58064
# 2  Afghanistan  2014                                45481
# 3  Afghanistan  2013                                 3957

条件查询函数

除了使用python提供的关系运算符(==, !=, <, <=, >, >=)和位运算符(&, |, ^)编写条件表达式,pandas还提供了以下函数用于支持条件查询,这些函数的返回值都是包含bool值的序列。

函数

说明

Series.between(left, right, inclusive=True)

等价于:left <= series <= right

inclusive:是否包含边界

Series.isin(values)

判断序列中是否包含values中的值

values:列表或者集合

Series.str.contains('Africa')

基于字符串的操作方法。

判断序列中的值是否包含'Africa'

import pandas as pd

df = pd.read_csv("data/cholera_data.csv", nrows=100)
# 使用python方法
print("-"*32, "使用python方法", "-"*32)
print(df[(df.Year >= 2016) & (df.Country == 'Australia')])
#           Country  Year  ...  Cholera case fatality rate       WHO Region
# 76  Australia  2016  ...                         0.0  Western Pacific
#
# [1 rows x 6 columns]

# 使用pandas方法
print("-" * 32, "使用pandas方法", "-" * 32)
print(df[df.Year.between(2014, 2016)][:4])    # 先筛选出year在[2014, 2016]的数据,再筛选出前4行数据
#             Country  Year  ...  Cholera case fatality rate             WHO Region
# 0   Afghanistan  2016  ...                        0.70  Eastern Mediterranean
# 1   Afghanistan  2015  ...                        0.01  Eastern Mediterranean
# 2   Afghanistan  2014  ...                        0.00  Eastern Mediterranean
# 43       Angola  2016  ...                        3.80                 Africa

print(df[df.Country.isin(['Angola', 'Australia'])][:3])
#        Country  Year  ...  Cholera case fatality rate  WHO Region
# 43  Angola  2016  ...                        3.80      Africa
# 44  Angola  2014  ...                        1.40      Africa
# 45  Angola  2013  ...                        1.29      Africa
#
# [3 rows x 6 columns]

# 使用字符串的方法
print("-" * 32, "使用字符串的方法", "-" * 32)
print(df[df['WHO Region'].str.contains('Africa')][:3])
#         Country  Year  ...  Cholera case fatality rate  WHO Region
# 23  Algeria  2006  ...                        0.00      Africa
# 24  Algeria  2005  ...                        0.00      Africa
# 25  Algeria  1994  ...                        3.39      Africa
#
# [3 rows x 6 columns]

增删改数据

新增列

① 在原来的列后面插入新列。

df['列名'] = values

print("原来的列:\n", df.columns)
# Index(['Country', 'Year', 'Number of reported cases of cholera',
#        'Number of reported deaths from cholera', 'Cholera case fatality rate',
#        'WHO Region'],
#       dtype='object')

# 新增列
df["Comments"] = "cholera"
df["死亡率"] = df['Number of reported deaths from cholera'] / df['Number of reported cases of cholera']
print("增加列后:\n", df.columns)
# Index(['Country', 'Year', 'Number of reported cases of cholera',
#        'Number of reported deaths from cholera', 'Cholera case fatality rate',
#        'WHO Region', 'Comments', '死亡率'],
#       dtype='object')

② 在指定位置插入一列。

DataFrame.insert(loc, column, value, allow_duplicates=False)

loc:指定要插入的位置。0 <= loc <= len(columns)。

column:要插入的列标签。

value:该列的值。可以是int,Series或array-like。

print("插入列前:\n", df.columns)
# Index(['Year', 'Number of reported cases of cholera',
#        'Number of reported deaths from cholera', 'Cholera case fatality rate',
#        'WHO Region'],
#       dtype='object')
df.insert(0, 'Country', 'aaa')
print("插入列后:\n", df.columns)
# Index(['Country', 'Year', 'Number of reported cases of cholera',
#        'Number of reported deaths from cholera', 'Cholera case fatality rate',
#        'WHO Region'],
#       dtype='object')

删除数据

① 删除行或数据。

DataFrame.drop(labels=None, axis=0, index=None, columns=None, level=None, inplace=False, errors="raise")

labels:要删除的标签

axis:指定按哪个轴删除。0:按行删除,1:按列删除。默认值为0。

columns:指定要删除的列。

inplace:是否原地修改。

df.drop(labels=['Comments', '死亡率'], axis=1, inplace=True)
# 等价于 df.drop(columns=['Comments', '死亡率'], inplace=True)
print("删除列后:\n", df.columns)
# Index(['Country', 'Year', 'Number of reported cases of cholera',
#        'Number of reported deaths from cholera', 'Cholera case fatality rate',
#        'WHO Region'],
#       dtype='object')
print("删除行前:\n", df.head(4))
#             Country  Year  ...  Cholera case fatality rate             WHO Region
# 0  Afghanistan  2016  ...                        0.70  Eastern Mediterranean
# 1  Afghanistan  2015  ...                        0.01  Eastern Mediterranean
# 2  Afghanistan  2014  ...                        0.00  Eastern Mediterranean
# 3  Afghanistan  2013  ...                        0.35  Eastern Mediterranean
df.drop(labels=[0, 2], axis=0, inplace=True)
print("删除行后:\n", df.head(4))
#             Country  Year  ...  Cholera case fatality rate             WHO Region
# 1  Afghanistan  2015  ...                        0.01  Eastern Mediterranean
# 3  Afghanistan  2013  ...                        0.35  Eastern Mediterranean
# 4  Afghanistan  2012  ...                        0.10  Eastern Mediterranean
# 5  Afghanistan  2011  ...                        1.18  Eastern Mediterranean

② 删除一列数据。

del df['列名']

print("删除列前:\n", df.columns)
# Index(['Country', 'Year', 'Number of reported cases of cholera',
#        'Number of reported deaths from cholera', 'Cholera case fatality rate',
#        'WHO Region'],
#       dtype='object')
del df['Country']
print("删除列后:\n", df.columns)
# Index(['Year', 'Number of reported cases of cholera',
#        'Number of reported deaths from cholera', 'Cholera case fatality rate',
#        'WHO Region'],
#       dtype='object')

修改数据

① 修改筛选出的数据。

DataFrame.loc[row_indexer,col_indexer] = value

【注意:只能通过loc方法修改数据,df[][]返回的是数据的副本。】

print("修改数据前:\n", df.loc[:2, 'Year'])
# 0    2016
# 1    2015
# 2    2014
# Name: Year, dtype: int64
df.loc[:3, 'Year'] = 2000
print("修改数据后:\n",df.loc[:2, 'Year'])
# 0    2000
# 1    2000
# 2    2000
# Name: Year, dtype: int64

② 修改行列标签名

DataFrame.rename(mapper: Optional[Renamer] = None,*, index: Optional[Renamer] = None,columns: Optional[Renamer] = None,axis: Optional[Axis] = None,copy: bool = True, inplace: bool = False, level: Optional[Level] = None,errors: str = "ignore",)

# 修改列标签
df.rename(columns={'Number of reported cases of cholera': '总人数',
                   'Number of reported deaths from cholera':'死亡人数',
                   'Cholera case fatality rate':'死亡率'}, inplace=True)
print(df.columns)
# Index(['Country', 'Year', '总人数', '死亡人数', '死亡率', 'WHO Region'], dtype='object')

# 修改行标签
df.rename(index={0:'0000', 1:'0001'}, inplace=True)
print(df.head(3))
#           Country  Year    总人数  死亡人数   死亡率             WHO Region
# 0000  Afghanistan  2000    677   5.0  0.70  Eastern Mediterranean
# 0001  Afghanistan  2000  58064   8.0  0.01  Eastern Mediterranean
# 2     Afghanistan  2000  45481   4.0  0.00  Eastern Mediterranean

 

本文地址:https://blog.csdn.net/p_memory/article/details/107435239

上一篇:

下一篇: