当前位置: 移动技术网 > IT编程>脚本编程>Python > Python数据分析常用库-pandas库基础操作

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

2020年07月20日  | 移动技术网IT编程  | 我要评论

目录

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

如对本文有疑问, 点击进行留言回复!!

相关文章:

验证码:
移动技术网