Python数据分析常用库-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