Pandas
-
Pandas是一个开源的数据分析和数据处理库,基于python编程语言的一个扩展程序库
-
Pandas提供易于使用的数据结构和数据分析工具,特别适用于处理结构化数据,如表格型数据
-
Pandas 是数据科学和分析领域中常用的工具之一,它使得用户能够轻松地从各种数据源中导入数据,并对数据进行高效的操作和分析
-
Pandas 是一个强大的分析结构化数据的工具集,基础是Numpy(提供高性能的举矩形运算)
Pandas特点
- 处理各种数据结构,尤其是表格型数据,如 SQL 数据库或 Excel 表格
- 数据结构:Series 和 DataFrame
- 数据加载与保存:可以从各种数据源加载数据,包括 CSV 文件、Excel 表格、SQL
数据库、JSON 文件等,并且可以将处理后的数据保存到这些格式中 - 数据清洗与转换:提供了丰富的函数和方法,用于数据清洗、处理缺失值、重复值、异常值等,以及进行数据转换、重塑和合并操作
- 数据分析与统计:提供了各种统计函数和方法,用于描述性统计、聚合操作、分组
运算、透视表等数据分析任务 - 数据可视化:结合 Matplotlib 库,可以进行数据可视化,绘制各种统计图表,如
折线图、散点图、直方图等
数据结构
- Series(一维数据)
- Series 是一种类似于一维数组的对象,它由一组数据以及一组与之相关的数据标签(索引)组成
- DataFrame(二维数据)
- DataFrame 是一个表格型的数据结构,它含有一组有序的列,既有行索引也有列索引,它可以被看做由 Series 组成的字典(共同用一个索引)
安装导入
#pip安装pandas
pip install pandas -i https://pypi.tuna.tsinghua.edu.cn/simple
#安装成功后,我们就可以导入 pandas 模块使用:
import pandas as pd
Series特点
- 一维数组:只有一个轴(或维度),类似于Python中的列表
- 索引:每个Series都有一个索引,可以是整数、字符串类型,不指定索引将默认创建一个从0开始的整数索引
- 数据类型:Series可以容纳不同数据类型的元素,包括整数、浮点数、字符串、python对象等
- 操作:Series支持各种操作,如数学运算,统计分析、字符串处理等
- 缺失数据:Series 可以包含缺失数据,使用NaN来表示缺失或无值
创建Series
- 使用Series()构造函数创建Series对象,传递一个数据数组和一个可选的索引数组
import pandas as pd
import numpy as np
#使用列表创建Series
s = pd.Series([1, 2, 3, 4, 5])
#使用Numpy数组创建Series
s = pd.Series(np.array([1, 2, 3, 4, 5]))
#使用字典创建Series
s = pd.Series({'a': 1, 'b': 2, 'c': 3, 'd': 4, 'e': 5})
"""
a 1
b 2
c 3
d 4
e 5
dtype: int64
"""
# 创建Series并指定索引
s = pd.Series([1,2,3,4],index=['a','b','c','d'])
print(s['a']) # 返回索引标签 'a' 对应的元素
print(s['a':'c']) # 返回索引标签 'a' 到 'c' 之间的元素
"""
a 1
b 2
c 3
dtype: int64
"""
print(s[1:3])
"""
b 2
c 3
dtype: int64
"""
# 索引和值的关系
for index,value in s.items():
print(index,value)
"""
a 1
b 2
c 3
d 4
"""
#切片语法访问Series一部分
print(s[:3]) # 返回前三个元素
# 为特定索引标签赋值
s['a'] = 10
print(s)
# 通过赋值给新的索引标签来添加元素
s['e'] = 5
# del删除指定索引标签的元素,删除单个,在原有基础上删除
del s['a']
# drop 方法删除一个或者多个索引标签,并返回一个新的Series
s_dropped = s.drop(['b'])
基本运算
- 算数运算
series = pd.Series([10, 8, 7, 4, 2])
# 算数运算
result = series * 2 # 值乘以2
# 进行排序后叠加
d1 = dict(a=1, b=2, c=3, d=4, e=5)
d2 = dict(a=10, b=20, c=30, d=40, e=50)
s1 = pd.Series(d1)
s2 = pd.Series(d2)
print(s1 + s2)
# 过滤(默认是值)
filtered_series = series[series > 5] # # 选择大于5的元素
s = pd.Series(data=[1, 2, 3, 4, 4], index=['a', 'b', 'c', 'd', 'e'])
print(s[s>3])
"""
d 4
e 4
dtype: int64
"""
# 数学函数
import numpy as np
s = pd.Series([16,25,36])
r = np.sqrt(s) # 对每个元素取平方根
# 转换成整数
r = r.astype('int')
print(r)
属性和方法(有小括号方法,没有小括号属性)
属性和方法 | 说明 |
---|---|
index = Series.index | 获取索引 |
values = Series.values | 获取数据 |
stats = Series.describe() | 获取描述统计信息 |
max_index = Series.idxmax() | 获取最大值索引 |
min_index = Series.idxmin() | 获取最小值索引 |
Series.dtype | 数据类型 |
Series.shape | 形状 |
Series.size | 元素个数(看一维数组里面有几个) |
Series.count() | 元素个数(方法) |
Series.head() | 前几个元素,默认前五个 |
Series.tail() | 后几个元素,默认后五个 |
Series.sum() | 求和 |
Series.mean() | 平均值 |
Series.std() | 标准差 |
Series.min() | 最小值 |
Series.max() | 最大值 |
print( Series > 2) | 返回一个布尔 Series,其中的元素值大于 2 |
Series = Series.astype(‘float64’) | 将 Series 中的所有元素转换为float64类型,转换数据类型,生成一个复本返回 |
data = data.value_counts() | 统计次数 |
data = data.sort_values(ascending=True) | 升序排列,后边为False时候降序排序 |
data = data.iloc[1:4] | 选取从索引位置 1 开始到索引位置 4(但不包括索引位置 4)的行或元素 |
data.unique() | 去重 |
# s > 33 返回的是bool值,s[s>30]返回的是数值
s = pd.Series([11, 22, 33, 44, 55, 66, 77, 88])
print(s > 33)
print('*'*30)
print(s[s > 33])
"""
0 False
1 False
2 False
3 True
4 True
5 True
6 True
7 True
dtype: bool
******************************
3 44
4 55
5 66
6 77
7 88
dtype: int64
"""
DataFrame
- 用于表示二维表格型数据,Pandas中的另一个核心数据结构
- 既有行索引也有列索引,它可以被看做由 Series组成的字典(共同用一个索引)
data = {'calories': [420, 380, 390], 'duration': [50, 40, 45]}
df = pd.DataFrame(data, ['day1', 'day2', 'day3'])
print(df)
"""
calories duration
day1 420 50
day2 380 40
day3 390 45"""
print("=" * 30)
print(df.loc['day2']['calories']) # 380
print("=" * 30)
print(df.loc[['day1', 'day2']].loc['day2']['calories']) # 380
创建DataFrame
# 使用列表创建(二维列表中的每个列表表示一行,需要指定列名)
data = [['Google',10],['Baidu',12],['Wiki',13]]
df = pd.DataFrame(data,columns=['Site','Age'])
# 字典创建(其中键作为列名,值作为列数据)
data = {'Site':['Google', 'Baidu', 'Wiki'], 'Age':[10, 12, 13]}
df = pd.DataFrame(data)
# 列表套字典(每个字典元素表示一行数据,每个字典里面的键是列名)
data = [{'Site':'Google','Age':10},{'Site':'Baidu','Age':10},{'Site':'Wiki'}]
df = pd.DataFrame(data)
# 字典套字典,其中外部字典的键作为列名,内部字典的键作为索引
di1 = {'a':1, 'b':2, 'c':3}
di2 = {'a':4, 'b':5, 'c':6}
di3 = {'k1':di1,'k2':di2}
df = pd.DataFrame(di3)
print(df)
"""
k1 k2
a 1 4
b 2 5
c 3 6"""
# 使用ndarrays创建
ndarray_data = np.array([['Google', 10], ['Baidu', 12], ['Wiki', 13]])
df = pd.DataFrame(ndarray_data,columns=['Site','Age'])
print(df)
"""
Site Age
0 Google 10
1 Baidu 12
2 Wiki 13
"""
# 字典创建DataFrame
df = pd.DataFrame({'Column1':[1,2,3],'Column2':[4,5,6]})
#列表创建DataFrame
df = pd.DataFrame([[1,2,3],[4,5,6],[7,8,9]],columns=['Column1','Column2','Column3'])
# 通过Numpy数组创建DataFrame
df = pd.DataFrame(np.array([[1,2,3],[4,5,6],[7,8,9]]))
# Series创建DataFrame
s1 = pd.Series(['Alice','Bob','Charlie'])
s2 = pd.Series([25,30,35])
s3 = pd.Series(['New York','Jack','Mary'])
df = pd.DataFrame({'Name':s1,'Age':s2,'City':s3})
print(df)
"""
Name Age City
0 Alice 25 New York
1 Bob 30 Jack
2 Charlie 35 Mary
"""
DataFrame 的属性和方法
属性和方法 | 说明 |
---|---|
df.loc[索引] | 返回指定行的数据,索引从 0 开始,返回结果其实就是一个DataFrame 数据 |
df.shape | 形状 |
df.columns | 列名 |
df.index | 索引 |
df.head() | 前几行数据,默认是前 5 行 |
df.tail() | 后几行数据,默认是后5行 |
df.info() | 数据信息 |
df.describe() | 描述统计信息 |
df.mean() | 求平均值 |
de.sum() | 求和 |
df.dtypes | 查看数据类型 |
df.astype (‘类型’) | 转换数据类型,df[‘Column’] = df[‘Column’].astype(‘float64’) |
访问DataFrame元素
-
两个数据作为一个参数进行包装,用列表放一起
-
访问列
df = pd.DataFrame([[1, 2, 3], [4, 5, 6], [7, 8, 9]],
columns=['Column1', 'Column2', 'Column3'])
print(df['Column1']) # 通过列名访问
print(df.Column2) # 通过属性访问,列名当属性
print(df.loc[:, 'Column1']) # 通过列名访问
print(df.iloc[:, 0]) # 通过索引访问
print(df['Column1'][0]) # 访问单个元素
- 访问行
print(df.loc[2, 'Column1'])# 通过行标签访问
修改DataFrame
- 修改列数据:直接对列进行赋值
df['Column'] = [data1, data2, data3]
- 添加新列:给新列赋值
df['NewColumn'] = [data1, data2, data3]
- 添加新行:使用loc方法
df.loc[Index] = [data1, data2, data3]
删除DataFrame元素
#删除列:使用 drop 方法
df_dropped = df.drop('Column', axis=1)
#删除行:同样使用 drop 方法
df_dropped = df.drop(Index)
DataFrame统计分析
- 描述性统计:使用**.describe()**查看数值列的统计摘要
- 计算统计数据:使用聚合函数如 .sum()、.mean()、.max() 等
- df[‘Column’].sum()
- df.mean()
DataFrame索引操作
- 重置索引:.reset_index()
df_reset = df.reset_index(drop=True)
- 设置索引:.set_index()
df_set = df.set_index('Column')
- 根据条件过滤DataFrame
df[(df['Column'] > 2) & (df['Column'] < 5)]
df = pd.DataFrame([[1, 2, 3], [4, 5, 6], [7, 8, 9]],
columns=['Column1', 'Column2', 'Column3'])
print(df)
a = df[(df['Column1'] > 5) & (df['Column2'] > 5)]
print(a)
"""
Column1 Column2 Column3
0 1 2 3
1 4 5 6
2 7 8 9
Column1 Column2 Column3
2 7 8 9
"""
DataFrame 的合并
- 纵向合并:
concat
看列名是否相同,没有此列的数据会用NAN代替
# df2接在df1的下边
pd.concat([df1, df2], ignore_index=True)
df1 = pd.DataFrame({'c1': ['aa', 'bb', 'cc']})
df2 = pd.DataFrame({'c2': ['dd', 'ee', 'ff']})
print(df1)
print(df2)
print("="*30)
df3 = pd.concat((df1, df2))
print(df3)
"""
c1 c2
0 aa NaN
1 bb NaN
2 cc NaN
0 NaN dd
1 NaN ee
2 NaN ff"""
- 横向合并:
merge
pd.merge(df1, df2, on='Column')
df1 = pd.DataFrame({'name': ['tom', 'jack', 'rose'], 'chinese': [99, 88, 77]})
df2 = pd.DataFrame({'name': ['tom', 'jack', 'josn'], 'math': [94, 84, 74]})
df3 = pd.merge(df1, df2, on='name', how='left') #补充左边的
df3 = pd.merge(df1, df2, on='name', how='right') # 补充右边
df3 = pd.merge(df1, df2, on='name', how='outer') # 全部包含
print(df3)
"""
name chinese math
0 tom 99 94.0
1 jack 88 84.0
2 rose 77 NaN
name chinese math
0 tom 99.0 94
1 jack 88.0 84
2 josn NaN 74
name chinese math
0 jack 88.0 84.0
1 josn NaN 74.0
2 rose 77.0 NaN
3 tom 99.0 94.0"""
索引和切片
- DataFrame支持对行和列进行索引和切片操作
data = {'Site': ['Google', 'Baidu', 'Wiki'], 'Age': [20, 22, 23]}
df = pd.DataFrame(data)
# 提取多列
print(df[['Site','Age']])
# 切片多行
print(df[1:3])
# 提取单列
print(df.loc[:,'Site'])
"""
0 Google
1 Baidu
2 Wiki
Name: Site, dtype: object
"""
# 根据标签提取指定行列,(第二行开始的两列)
print(df.loc[1:2, ['Site', 'Age']])
# 根据索引提取指定行列(所有行,从第二列开始的全部)
print(df.iloc[:, 1:])
"""
Age
0 20
1 22
2 23
"""
s1 = pd.Series(['tom', 'jack', 'rose'], ['001', '002', '003'])
s2 = pd.Series([99, 88, 77], ['001', '002', '003'])
s3 = pd.Series([65, 85, 74], ['001', '002', '003'])
df = pd.DataFrame({'name': s1, 'chinese': s2, 'math': s3})
print(df)
print("=" * 30)
# 提取一列
print(df['name'])
# 提取多列
print(df[['math','chinese']])
# 提取一行
print(df.loc['001'])
# 提取多行
print(df.loc[['001', '002']])
# 切片多行
print(df[1:3])
print(df.loc["002":"003", ['name', 'chinese']])
print(df.iloc[1:3, 0:2]) # 这些数字表示默认索引
CSV文件
-
CSV(Comma-Separated Values,逗号分隔值,也称为字符分隔值,
因为分隔字符也可以不是逗号) -
以纯文本形式存储表格数据
-
CSV 是一种通用的、相对简单的文件格式,被商业和科学广泛应用
-
打开csv文件
df = pd.read_csv('./data/nba.csv')
print(df.to_string())
- to_string() :全部读取,用于返回 DataFrame 类型的数据,如果不使用该函数,则输出结果为数据的前面 5 行和末尾 5 行,中间部分以 … 代替。
- to_csv()方法:将DataFrame存储为csv文件
header=True
:是否将DataFrame的列名(即DataFrame的header)写入CSV文件index=True
:是否将DataFrame的索引(行标签)也写入CSV文件index_label='ind'
:当index=True
时,这个参数允许你为索引列指定一个标签名(起一个标签名)
name = ['Google', 'Baidu','Taobao', 'Wiki']
site = ['www.google.com', 'www.baidu.com', 'www.taobao.com', 'www.wiki']
age = [90,40,80,98]
dict = {'name':name, 'site':site, 'age':age}
df = pd.DataFrame(dict)
# 保存dataframe
df.to_csv('site.csv',header=True,index=True,index_label='ind')
JSON文件
- JSON(JavaScript Object Notation),是存储和交换文本信息的语法
- JSON 比 XML 更小、更快,更易解析
- 打开JSON文件打开JSON文件
df = pd.read_json('data/sites.json')
print(df.to_string())
- 写入json文件
names = ['tom', 'jack', 'rose']
chinese = [90,99,89]
math = [100,98,97]
df = pd.DataFrame({'name':names,'chinese':chinese,'math':math})
# 写入json文件
df.to_json('data/sites2.json')
数据清洗
- 数据清洗是对一些没有用的数据进行处理的过程
空值数据判断及删除:
-
通过**
isnull()
** 、 **isna()
**判断各个单元格是否为空,空值返回为True -
通过**
dropna()
**删除包含空数据的行或者指定列包含空数据的行(默认删除包含任何缺失值的行) -
**
na_values=[]
**参数指定了哪些字符串应该被视为缺失值(NaN) -
**dropna()**下属参数
- how =‘ ’ :any表示有一个空就全部删除,all表示所有都为空就删除
# how 参数 any表示有一个空就全部删除,all表示所有都为空就删除 # df2 = df.dropna(how='all') # df2 = df.dropna(how='any')
- **subset=[]**参数:指定了需要检查缺失值的列
#如果某一行在这两列中的任意一列存在缺失值(即NaN),那么整行都会被从DataFrame中删除 # subset参数指定了需要检查缺失值的列。 df2 = df.dropna(subset=['NUM_BEDROOMS','NUM_BATH']) print("="*30) print(df2)
df = pd.read_csv('data/property-data.csv')
print(df['NUM_BEDROOMS'])
print(df['NUM_BEDROOMS'].isnull())
"""
0 False
1 False
2 True
3 False
4 False
5 True
6 False
7 False
8 False
Name: NUM_BEDROOMS, dtype: bool"""
# 在CSV文件中可能表示缺失值的字符串('n/a', 'na', '--')
missing_values = ['n/a', 'na', '--']
# 通过na_values参数指定了哪些字符串应该被视为缺失值(NaN)
df = pd.read_csv('data/property-data.csv', na_values=missing_values)
print(df['NUM_BEDROOMS'])
print(df['NUM_BEDROOMS'].isnull())
# 从原始DataFrame df中删除所有包含至少一个缺失值的行得到的new_df
new_df = df.dropna()
print(new_df)
"""
PID ST_NUM ST_NAME OWN_OCCUPIED NUM_BEDROOMS NUM_BATH SQ_FT
0 100001000.0 104.0 PUTNAM Y 3.0 1 1000.0"""
替换字段
fillna()
:替换一些空字段,默认返回一个新的DataFrame
# 替换空字段
df = pd.read_csv('data/property-data.csv')
#将所有空值变为12345
fd = df.fillna(12345)
# 指定修改,返回指定的列
fd = df[['PID','ST_NUM']].fillna(12345)
# 详细指定每列数据的修改
fd = df[['PID','ST_NUM']].fillna({'PID':12345,'ST_NUM':23456})
print(fd)
- 替换空单元格的常用方法是计算列的均值、中位数或者众数
- mean()、median() 和 mode() 方法计算列的均值(所有值加起来的平均值)、中位数(排序后排在中间的数)和众数(出现频率最高的数)
数据格式错误
- 将列中的所有单元格转换为相同格式的数据
to_datetime(df['Date'], format='mixed')
:转换成datetime对象,- mixed是一种格式
- format
参数应该是一个具体的日期时间格式字符串,比如
’%Y/%m/%d’
# 数据格式错误的单元格会使数据分析变得困难,甚至不可能
# 第三个日期格式错误
data = {
"Date": ['2020/12/01', '2020/12/02' , '20201226'],
"duration": [50, 40, 45]
}
df = pd.DataFrame(data, index = ["day1", "day2", "day3"])
# 将字符串转换为datatime对象,format 参数应该是一个具体的日期时间格式字符串,比如 '%Y/%m/%d'
df['Date'] = pd.to_datetime(df['Date'], format='mixed')
print(df.to_string())
错误数据替换或移除
person = { "name": ['Google', 'Runoob' , 'Taobao'], "age": [50, 200, 12345]}
df = pd.DataFrame(person)
for x in df.index:
if df.loc[x, "age"] > 120:
df.loc[x, "age"] = 120 # 修改数据
df.drop(x,inplace=True) # 删除行,False为创建一个复本
print(df.to_string())
清洗重复数据
duplicated()
:如果对应的数据是重复的,duplicated() 会返回 True,否则返回 False
person = {
"name": ['Google', 'Baidu', 'Baidu', 'Taobao'],
"age": [50, 40, 40, 23]
}
df = pd.DataFrame(person)
print(df.duplicated())
"""
0 False
1 False
2 True
3 False
dtype: bool"""
drop_duplicates()
:删除重复数据
person = {
"name": ['Google', 'Baidu', 'Baidu', 'Taobao'],
"age": [50, 40, 40, 23]
}
df = pd.DataFrame(person)
df.drop_duplicates(inplace = True)
print(df.to_string())
"""
name age
0 Google 50
1 Baidu 40
3 Taobao 23"""
常用函数
读取数据
函数 | 说明 |
---|---|
pd.read_csv(filename) | 读取 CSV 文件 |
pd.read_excel(filename) | 读取 Excel 文件 |
pd.read_sql(query, connection_object) | 从 SQL 数据库读取数据 |
pd.read_json(json_string) | 从 JSON 字符串中读取数据 |
查看数据
函数 | 说明 |
---|---|
df.head(n) | 显示前 n 行数据 |
df.tail(n) | 显示后 n 行数据 |
df.info() | 显示数据的信息,包括列名、数据类型、缺失值等 |
df.describe() | 显示数据的基本统计信息,包括均值、方差、最大值、最小值等 |
df.shape | 显示数据的行数和列数 |
清洗数据
函数 | 说明 |
---|---|
df.dropna() | 删除包含缺失值的行或列 |
df.fillna(value) | 将缺失值替换为指定的值 |
df.replace(old_value, new_value) | 将指定值替换为新值 |
df.duplicated() | 检查是否有重复的数据 |
df.drop_duplicates() | 删除重复的数据 |
数据选择和切片
函数 | 说明 |
---|---|
df[column_name] | 选择指定的列 |
df.loc[row_index, column_name] | 通过标签选择数据 |
df.iloc[row_index, column_index] | 通过位置选择数据 |
df.ix[row_index, column_name] | 通过标签或位置选择数据 |
df.filter(items=[column_name1,column_name2]) | 选择指定的列 |
df.filter(regex=‘regex’) | 选择列名匹配正则表达式的列 |
df.sample(n) | 随机选择 n 行数据 |
数据排序
函数 | 说明 |
---|---|
df.sort_values(column_name) | 按照指定列的值排序 |
df.sort_values([column_name1,column_name2], ascending=[True,False]) | 按照多个列的值排序 |
df.sort_index() | 按照索引排序 |
数据分组和聚合
函数 | 说明 |
---|---|
df.groupby(column_name) | 按照指定列进行分组 |
df.aggregate(function_name) | 对分组后的数据进行聚合操作 |
df = pd.DataFrame({'class':['a','b','c','a','b','c','a','b','c'],
'mark':[1,2,3,1,2,3,1,2,3]})
print(df)
print("-"*30)
df2 = df.groupby('class').aggregate('sum') # 求和sum,最大值max,count
print(df2)
"""
class mark
a 3
b 6
c 9"""
数据选择和过滤
函数 | 说明 |
---|---|
df.loc[row_indexer, column_indexer] | 按标签选择行和列 |
df.iloc[row_indexer, column_indexer] | 按位置选择行和列 |
df[df[‘column_name’] > value] | 选择列中满足条件的行 |
df.query(‘column_name > value’) | 使用字符串表达式选择列中满足条件的行 |
数据统计和描述
函数 | 说明 |
---|---|
df.describe() | 计算基本统计信息,如均值、标准差、最小值、最大值等 |
df.mean() | 计算每列的平均值 |
df.median() | 计算每列的中位数 |
df.mode() | 计算每列的众数 |
df.count() | 计算每列非缺失值的数量 |
loc[]与iloc[]的介绍与区别
- loc接收的是行、列的名称或者标签,
- 在切片是按照闭区间切片,两边都可以取到,
- 返回结果是一个DataFrame数据,
- 返回指定行的数据,索引从0开始
- iloc接收的是行、列的索引位置(下标从0开始),不能是字符,左闭右开
- 相同点
- 两者都接收两个参数,第一个参数是行的范围,第二个参数是列的范围
- 两者都可以有行索引值没有列索引值,但有列索引值前必须得有行索引值,但loc[]行索引值只能为名称形式来取,不能按下标形式来取。iloc[]则相反
loc[]
- 1、单个行名/列名 或 行名/列名的列表
import pandas as pd
data = {'state': ['Ohio', 'Ohio', 'Ohio', 'Nevada', 'Nevada'],
'year': [2000, 2001, 2002, 2001, 2002],
'pop': [1.5, 1.7, 3.6, 2.4, 2.9]}
frame = pd.DataFrame(data)
frame.index = list('abcde')
# loc方法
# 1.读取第二行,行名为b
a = frame.loc['b']
# print(a)
"""
state Ohio
year 2001
pop 1.7
Name: b, dtype: object
"""
# 转换成dataframe对象
b = frame.loc[['b']]
# print(b)
"""
state year pop
b Ohio 2001 1.7
"""
# 取第1、2列的第2与第5行,第1、2列的列名分别为’state’与’year’,
# 第2、5行的行名分别为’b’和’e’
c = frame.loc[['b', 'e'], ['state', 'year']]
# print(c)
- 2.列名/行名的切片
# 读取第2列,列名为’year’
d = frame.loc[:, 'year']
print(d)
"""
a 2000
b 2001
c 2002
d 2001
e 2002
Name: year, dtype: int64
"""
# 取第2行第3列,第2行行名为’b’,第3列列名为’pop’
e = frame.loc['b', 'pop']
print(e)
"""1.7"""
# 读取dataframe某个区域,比如第3列的第2到第5行,第3列为"pop"列,第2到第5行即b行到e行。
f = frame.loc['b':'e','pop'] #返回的是<class 'pandas.core.series.Series'>对象。
print(f)
"""
b 1.7
c 3.6
d 2.4
e 2.9
Name: pop, dtype: float64
"""
f = frame.loc['b':'e',['pop']]
print(f)
"""
pop
b 1.7
c 3.6
d 2.4
e 2.9"""
# 取第1、2列的第2到第5行,第1、2列的列名分别为’state’和’yea‘列,第2、5行的行名为’b’和‘e’行。
g = frame.loc['b':'e',['state','year']]
print(g)
"""
state year
b Ohio 2001
c Ohio 2002
d Nevada 2001
e Nevada 2002"""
- 返回布尔型列表的表达式(判断或函数)
# 根据判断条件读取,取第3列大于2的。
h = frame.loc[frame['pop'] > 2, 'pop'] # 返回的是<class 'pandas.core.series.Series'>对象。
print(h)
"""
c 3.6
d 2.4
e 2.9
Name: pop, dtype: float64
"""
h = frame.loc[frame['pop'] > 2, ['pop']] # 返回的是<class 'pandas.core.frame.DataFrame'>对象。
print(h)
"""
pop
c 3.6
d 2.4
e 2.9
"""
# 根据函数读取,取第3列大于2的所有行与列
i = frame.loc[lambda x: x['pop'] > 2]
print(i)
"""
state year pop
c Ohio 2002 3.6
d Nevada 2001 2.4
e Nevada 2002 2.9"""
iloc方法
- 1、单个下标 或 若干下标构成的列表,从0开始
data = {'state': ['Ohio', 'Ohio', 'Ohio', 'Nevada', 'Nevada'],
'year': [2000, 2001, 2002, 2001, 2002],
'pop': [1.5, 1.7, 3.6, 2.4, 2.9]}
frame = pd.DataFrame(data)
frame.index = list('abcde')
# 取第2行的值。
a = frame.iloc[1]
print(a) # <class ‘pandas.core.series.Series’>对象
"""
state Ohio
year 2001
pop 1.7
Name: b, dtype: object"""
a = frame.iloc[[1]]
print(a) # <class ‘pandas.core.frame.DataFrame’>对象
"""
state year pop
b Ohio 2001 1.7"""
# 取第1、2列的第2与第5行。
b = frame.iloc[[1,4],[0,1]]
print(b)
"""
state year
b Ohio 2001
e Nevada 2002"""
- 2.下标的切片
# 取第二列的值
c = frame.iloc[:, 1]
print(c)
"""
a 2000
b 2001
c 2002
d 2001
e 2002
Name: year, dtype: int64"""
c = frame.iloc[:,[1]]
print(c)
"""
year
a 2000
b 2001
c 2002
d 2001
e 2002"""
# 取第二行第三列
d = frame.iloc[1, 2]
print(d)
"""1.7"""
# 读取dataframe某个区域,比如第3列的第2到第5行
f = frame.iloc[1:5,[2]]
print(f)
"""
pop
b 1.7
c 3.6
d 2.4
e 2.9"""
# 取第1、2列的第2到第5行
e = frame.iloc[1:5,[0,1]]
print(e)
"""
state year
b Ohio 2001
c Ohio 2002
d Nevada 2001
e Nevada 2002"""