赞
踩
目录
Pandas是一个强大的分析结构化数据的工具集;它的使用基础是Numpy(提供高性能的矩阵运算);用于数据挖掘和数据分析,同时也提供数据清洗功能。
pandas中文网:https://www.pypandas.cn/
本文中用到的数据来源于kaggle.com/datasets。
它是一种类似于一维数组的对象,是由一组数据(各种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函数。
- print("-" * 16, "删除序列中的数据", "-" * 16)
- print(s1.drop(["a", "b"]).values) # 31
- print(s1.values) # [111 21 31]
DataFrame是Pandas中的一个表格型的数据结构,类似于二维数组,包含有一组有序的列,每列可以是不同的值类型(数值、字符串、布尔型等)。
DataFrame即有行索引也有列索引,可以被看做是由Series组成的字典。
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
属性名称 | 说明 |
values | DataFrame的所有的数据 |
index | DataFrame的索引 |
columns | DataFrame的列名称 |
shape | 形状 |
ndim | 维度 |
dtypes | 每列的数据类型 |
size | 元素个数 |
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
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。