当前位置:   article > 正文

Python数据分析常用库-pandas库基础操作_sub_data.cholera case fatality rate

sub_data.cholera case fatality rate

目录

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

指定序列名称

示例:

  1. # 创建一个series对象,不指定索引时会自动创建索引
  2. s1 = pd.Series([1, 2, 3, 4, 5, 6])
  3. print(type(s1))
  4. # <class 'pandas.core.series.Series'>
  5. print(s1)
  6. # 0 1
  7. # 1 2
  8. # 2 3
  9. # 3 4
  10. # 4 5
  11. # 5 6
  12. # dtype: int64
  13. # 使用字典创建序列
  14. s1 = pd.Series({"a":11, "b":21, "c":31})
  15. print(s1)
  16. # dtype: int64
  17. # a 11
  18. # b 21
  19. # c 31
  20. # dtype: int64

序列的属性

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

序列基本操作

1、访问序列元素

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

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

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

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

2、序列追加数据

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

  1. s2 = pd.Series({"c":4, "d":5})
  2. print(s1.append(s2)) #
  3. # a 11
  4. # b 21
  5. # c 31
  6. # c 4
  7. # d 5
  8. # dtype: int64
  9. print(s1)
  10. # a 11
  11. # b 21
  12. # c 31
  13. # dtype: int64

3、修改序列的值

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

4、删除序列中数据

drop函数。

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

DataFrame数据框

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

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

创建DataFrame

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

参数名称

说明

data

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

index

行索引

columns

列名称

  1. # 通过列表创建DataFrame
  2. data = [["vivian", "女", 18], ["peter", "男", 20], ["lily", "女", 19]]
  3. cols = ["name", "sex", "age"]
  4. df1 = pd.DataFrame(data, columns=cols)
  5. print(df1)
  6. # name sex age
  7. # 0 vivian 女 18
  8. # 1 peter 男 20
  9. # 2 lily 女 19
  10. # 通过字典创建DataFrame,字典键会转化为列名称
  11. data2 = {"name":["vivian", "peter", "lily"],
  12. "sex":["女", "男", "女"],
  13. "age":[18, 20, 19]}
  14. df2 = pd.DataFrame(data2)
  15. print(df2)
  16. # name sex age
  17. # 0 vivian 女 18
  18. # 1 peter 男 20
  19. # 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函数才有此参数。

  1. df = pd.read_csv("data/cholera_data.csv", encoding="utf-8", header=0,
  2. na_values={"Cholera case fatality rate":0},
  3. dtype={"Country":str}, nrows=100, sep=",")
  4. print(df.shape)
  5. print(df.dtypes)
  6. print(df.head(10)) # 获取前10行数据
  7. 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”文件。

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

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

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

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

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

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

  1. # 单个列标签
  2. print(df['Country']) # 等价于 print(df.Country)
  3. # 0 Afghanistan
  4. # 1 Afghanistan
  5. # 2 Afghanistan
  6. # 3 Afghanistan
  7. # 4 Afghanistan
  8. # ...
  9. # 95 Australia
  10. # 96 Australia
  11. # 97 Australia
  12. # 98 Australia
  13. # 99 Australia
  14. # Name: Country, Length: 100, dtype: object
  15. print("列类型:", type(df.Country))
  16. # 列类型: <class 'pandas.core.series.Series'>
  17. # 选择多列数据
  18. print(df[['Country','Year']])
  19. # Country Year
  20. # 0 Afghanistan 2016
  21. # 1 Afghanistan 2015
  22. # 2 Afghanistan 2014
  23. # 3 Afghanistan 2013
  24. # 4 Afghanistan 2012
  25. # .. ... ...
  26. # 95 Australia 1994
  27. # 96 Australia 1993
  28. # 97 Australia 1992
  29. # 98 Australia 1988
  30. # 99 Australia 1987
  31. #
  32. # [100 rows x 2 columns]

③ 布尔表达式

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

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

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

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

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

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

① 单个行(列)标签。

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

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

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

③ 行(列)标签列表

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

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

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

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

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

  1. print(df.iloc[:4, :3]) # 返回前4行前3列数据
  2. # Country Year Number of reported cases of cholera
  3. # 0 Afghanistan 2016 677
  4. # 1 Afghanistan 2015 58064
  5. # 2 Afghanistan 2014 45481
  6. # 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'

  1. import pandas as pd
  2. df = pd.read_csv("data/cholera_data.csv", nrows=100)
  3. # 使用python方法
  4. print("-"*32, "使用python方法", "-"*32)
  5. print(df[(df.Year >= 2016) & (df.Country == 'Australia')])
  6. # Country Year ... Cholera case fatality rate WHO Region
  7. # 76 Australia 2016 ... 0.0 Western Pacific
  8. #
  9. # [1 rows x 6 columns]
  10. # 使用pandas方法
  11. print("-" * 32, "使用pandas方法", "-" * 32)
  12. print(df[df.Year.between(2014, 2016)][:4]) # 先筛选出year在[2014, 2016]的数据,再筛选出前4行数据
  13. # Country Year ... Cholera case fatality rate WHO Region
  14. # 0 Afghanistan 2016 ... 0.70 Eastern Mediterranean
  15. # 1 Afghanistan 2015 ... 0.01 Eastern Mediterranean
  16. # 2 Afghanistan 2014 ... 0.00 Eastern Mediterranean
  17. # 43 Angola 2016 ... 3.80 Africa
  18. print(df[df.Country.isin(['Angola', 'Australia'])][:3])
  19. # Country Year ... Cholera case fatality rate WHO Region
  20. # 43 Angola 2016 ... 3.80 Africa
  21. # 44 Angola 2014 ... 1.40 Africa
  22. # 45 Angola 2013 ... 1.29 Africa
  23. #
  24. # [3 rows x 6 columns]
  25. # 使用字符串的方法
  26. print("-" * 32, "使用字符串的方法", "-" * 32)
  27. print(df[df['WHO Region'].str.contains('Africa')][:3])
  28. # Country Year ... Cholera case fatality rate WHO Region
  29. # 23 Algeria 2006 ... 0.00 Africa
  30. # 24 Algeria 2005 ... 0.00 Africa
  31. # 25 Algeria 1994 ... 3.39 Africa
  32. #
  33. # [3 rows x 6 columns]

增删改数据

新增列

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

df['列名'] = values

  1. print("原来的列:\n", df.columns)
  2. # Index(['Country', 'Year', 'Number of reported cases of cholera',
  3. # 'Number of reported deaths from cholera', 'Cholera case fatality rate',
  4. # 'WHO Region'],
  5. # dtype='object')
  6. # 新增列
  7. df["Comments"] = "cholera"
  8. df["死亡率"] = df['Number of reported deaths from cholera'] / df['Number of reported cases of cholera']
  9. print("增加列后:\n", df.columns)
  10. # Index(['Country', 'Year', 'Number of reported cases of cholera',
  11. # 'Number of reported deaths from cholera', 'Cholera case fatality rate',
  12. # 'WHO Region', 'Comments', '死亡率'],
  13. # dtype='object')

② 在指定位置插入一列。

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

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

column:要插入的列标签。

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

  1. print("插入列前:\n", df.columns)
  2. # Index(['Year', 'Number of reported cases of cholera',
  3. # 'Number of reported deaths from cholera', 'Cholera case fatality rate',
  4. # 'WHO Region'],
  5. # dtype='object')
  6. df.insert(0, 'Country', 'aaa')
  7. print("插入列后:\n", df.columns)
  8. # Index(['Country', 'Year', 'Number of reported cases of cholera',
  9. # 'Number of reported deaths from cholera', 'Cholera case fatality rate',
  10. # 'WHO Region'],
  11. # 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:是否原地修改。

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

② 删除一列数据。

del df['列名']

  1. print("删除列前:\n", df.columns)
  2. # Index(['Country', 'Year', 'Number of reported cases of cholera',
  3. # 'Number of reported deaths from cholera', 'Cholera case fatality rate',
  4. # 'WHO Region'],
  5. # dtype='object')
  6. del df['Country']
  7. print("删除列后:\n", df.columns)
  8. # Index(['Year', 'Number of reported cases of cholera',
  9. # 'Number of reported deaths from cholera', 'Cholera case fatality rate',
  10. # 'WHO Region'],
  11. # dtype='object')

修改数据

① 修改筛选出的数据。

DataFrame.loc[row_indexer,col_indexer] = value

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

  1. print("修改数据前:\n", df.loc[:2, 'Year'])
  2. # 0 2016
  3. # 1 2015
  4. # 2 2014
  5. # Name: Year, dtype: int64
  6. df.loc[:3, 'Year'] = 2000
  7. print("修改数据后:\n",df.loc[:2, 'Year'])
  8. # 0 2000
  9. # 1 2000
  10. # 2 2000
  11. # 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",)

  1. # 修改列标签
  2. df.rename(columns={'Number of reported cases of cholera': '总人数',
  3. 'Number of reported deaths from cholera':'死亡人数',
  4. 'Cholera case fatality rate':'死亡率'}, inplace=True)
  5. print(df.columns)
  6. # Index(['Country', 'Year', '总人数', '死亡人数', '死亡率', 'WHO Region'], dtype='object')
  7. # 修改行标签
  8. df.rename(index={0:'0000', 1:'0001'}, inplace=True)
  9. print(df.head(3))
  10. # Country Year 总人数 死亡人数 死亡率 WHO Region
  11. # 0000 Afghanistan 2000 677 5.0 0.70 Eastern Mediterranean
  12. # 0001 Afghanistan 2000 58064 8.0 0.01 Eastern Mediterranean
  13. # 2 Afghanistan 2000 45481 4.0 0.00 Eastern Mediterranean

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/凡人多烦事01/article/detail/209906
推荐阅读
相关标签
  

闽ICP备14008679号