pandas入门笔记

 

Pandas的DataFrame简介

  • Pandas是用于数据分析的开源Python库,可以实现数据加载,清洗,转换,统计处理,可视化等功能

  • DataFrame和Series是Pandas最基本的两种数据结构

  • DataFrame用来处理结构化数据(SQL数据表,Excel表格)

  • Series用来处理单列数据,也可以把DataFrame看作由Series对象组成的字典或集合

conda activate base  # 可选操作,切换虚拟环境
# pip install pandas  # 自行创建的虚拟环境中需要额外安装pandas
cd D:\ # 切换磁盘位置,可选操作
cd pandas
jupyter notebook  # 启动

import pandas as pd  # 导入pandas包
df = pd.read_csv('data/movie.csv') # 加载movie.csv文件
df.head() # 展示前5条数据

df = pd.read_csv('data/gapminder.tsv',sep='\t') 
# 参数1 要加载的文件路径;参数2 sep传入分隔符,默认是','  '\t'制表符
print(df) 
type(df)  # 内置函数type查看返回的数据类型

# 注意:属性不带(),方法带()
df.shape  # 【属性】获取行数和列数
df.columns  # 【属性】获取列名
df.dtypes  # 【属性】获取数据类型
df.info()  # 【方法】获取数据类型
country_df = df['country']  # 通过df['列名']方式,加载一列数据
country_df.head()  # 获取数据前5行
subset = df[['country','continent','year']]  # 通过列名加载多列数据
# df[['列名1','列名2',...]],这里是两层[] 可以理解为df[列名的list]
print(subset.tail(n))  # 不填值时打印后默认五行数据
print(df.head(n))  #  按行加载部分数据,不填值时默认打印前5行数据,
print(df.loc[0])  # df.loc[n] 传入行的索引,来获取一行,或多行数据

number_of_rows = df.shape[0]  # 通过shape 获取一共有多少行
last_row_index = number_of_rows - 1  # 总行数-1 获取最后一行行索引
print(df.loc[last_row_index])  # 获取最后一行数据,并打印
print(df.tail(n=1))  # tail方法默认输出一行 传入n=1控制只显示1行


# `df.loc` 和`df.tail` 两种方式获得的最后一行数据的类型不同
subset_loc = df.loc[0] 
subset_head = df.head(n=1)
print(type(subset_loc))
print(type(subset_head)) 

print(df.iloc[0])  # 使用`iloc`获取第一行数据,并打印
print(df.iloc[99])  # 使用`iloc`获取第100行数据,并打印
print(df.iloc[-1])  # 获取最后一行数据,这里-1是下标

print(df.iloc[4:7])  # 返回指定范围的多行数据,注意左闭右开
print(df.iloc[:3])  # 返回前3行数据,注意左闭右开
print(df.iloc[-3:])  # 返回后3行数据,注意左闭右开

# 根据行或列获取指定范围的数据
# loc和iloc属性既可以用于获取行数据,也可以用于获取列数据
# df.iloc[[行索引下标],[列索引下标]]
print(df.iloc[[0],[0]])  # 返回第一行,第一列的数据
print(type(df.iloc[[0],[0]]))  
print(df.iloc[42,0])  # 返回第42行,第1列的数据
print(type(df.iloc[42,0]))

# df.loc[[行索引值],[列索引值]]
print(df.loc[[0],['country']])  # 返回第一行,第一列的数据
print(type(df.loc[[0],['country']]))
print('='*10)
print(df.loc[42,'country'])
print(type(df.loc[42,'country']))

# 使用loc获取数据中的1列或几列
# `df.loc[:,[列名]] `,2:4表示行切片,冒号表示所有行,
subset = df.loc[2:4, ['year','pop']]  # 2:4表示行切片,
subset = df.loc[0:2,['year','pop']]
subset = df.loc[:,['year','pop']]  # 冒号表示所有行,
print(subset.head())

#  使用iloc获取数据中的1列或几列
# df.iloc[:,[列序号1,列序号2,列序号3...]]  列序号之间用逗号隔开
subset = df.iloc[:,[2,4,-1]]
print(subset.head())

# df.iloc[:,[列索引切片]]  冒号隔开的是切片和步长
subset = df.iloc[:,3:6]  # 在 iloc中使用切片语法获取几列数据
print(subset.head())

subset = df.iloc[:,0:6:2]  # 0:6:2 表示下标范围从0列到5列,2是步长
print(subset.head())

# 通过columns字段获取,返回一个numpy类型的array【array数组】
print(df.columns.values)
print(list(df))  # 通过list列表列出

#df.columns返回index,
# 通过tolist()或者list(df.columns)转换为list类型
print(df.columns.tolist())

# 行号列号取数据
print(df.iloc[[0,99,999],[0,3,5]])
# 格式:print(df.iloc[[行号1,行号2...],[列号下标1,列号下标2]]) 
# 获取 第1、100、1000行的第1、4、6列的数据(以下标获取)

# 行号、列名 取数据
# 【好处:1.增加代码的可读性;2.避免因列顺序的变化取出错误的数据】
# 实际工作中,建议传入实际的列名,
print(df.loc[[0,99,999],['country','lifeExp','gdpPercap']])

# 行切片列名或列号取数据
# 可以在loc 和 iloc 属性的行部分使用切片获取数据
print(df.loc[2:6, ['country','lifeExp','gdpPercap']])
 # 根据行名、列名取值

print(df.iloc[2:6, [0,3,5]]) # 根据行号、列号取值

# 注意两者返回结果的区别
print(df.loc[2:6, ['country','lifeExp','gdpPercap']])
# 根据行名、列名取值
print(df.iloc[2:6, [0,3,5]]) # 根据行号、列号取值
# 差异原因解析:值切片的原则是左闭右也闭,下标切片的原则是左闭右开
#loc[2:6,...] loc是按值取数,所以行号的值是2到6的都取出
#iloc[2:6,...] iloc是按下标取数,所以行下标是2到5的都取出

  • Pandas与Python常用数据类型对照:

Pandas类型

Python类型

说明

Object

string

字符串类型

int64

int

整形

float64

float

浮点型

datetime64

datetime

日期时间类型,python中需要加载

Pandas统计计算

分组-聚合计算:

  • 先将数据分组
  • 对每组的数据再去进行统计计算。如,求avg、count等
  • 再将每一组计算的结果合并起来
  • 可以使用DataFrame的groupby方法完成分组/聚合计算
print(df.head(10))
# print(df.groupby('被分组的列名')['lifeExp'].聚合函数())
print(df.groupby('year')['lifeExp'].mean())
# 计算每一年的平均预期寿命(指定列分组之后对指定的列计算平均值)

# 通过`df.groupby('year')`先创一个分组对象,
# 如果打印这个分组的DataFrame,会返回一个内存地址
grouped_year_df = df.groupby('year')
print(type(grouped_year_df))
print(grouped_year_df)

# 我们可以从分组之后的DataFrameGroupBy数据分组对象中,
# 传入列名获取我们感兴趣的数据,并进行进一步计算
# 计算每一年的平均预期寿命,我们需要用到 lifeExp  这一列
# 我们可以使用上一小节介绍的方法获取分组之后数据中的一
grouped_year_df_lifeExp = grouped_year_df['lifeExp']
print(type(grouped_year_df_lifeExp)) 
print(grouped_year_df_lifeExp)

# 最后对分组后的数据计算平均值
mean_lifeExp_by_year = grouped_year_df_lifeExp.mean()
# 最后对分组后的数据计算平均值
print(mean_lifeExp_by_year)

# 指定多列分组之后对指定的多列计算平均值
# 上面的例子只是对一列 lifeExp 进行了分组求平均,
# 如果想对多列值进行分组聚合代码也类似
print(df.groupby(['year', 'continent'])[['lifeExp','gdpPercap']].mean())

上面的代码按年份和大洲对数据进行分组,针对每一组数据计算了对应的平均预期寿命 lifeExp 和 平均GDP

输出的结果中 year continent 和 lifeExp gdpPercap 不在同一行, year continent两个行索引存在层级结构,后面的章节会详细介绍这种复合索引的用法

如果想去掉 year continent的层级结构,可以使用reset_index方法(重置行索引)

multi_group_var = df.groupby(['year', 'continent'])[['lifeExp','gdpPercap']].mean() 
flat = multi_group_var.reset_index()
print(flat.head(15))

分组频数计算

在数据分析中,一个常见的任务是计算频数

  • 可以使用 nunique 方法 计算Pandas Series的唯一值计数

在数据中,每个大洲列出现了多少个国家和地区?

df.groupby('continent')['country'].nunique()

5 基本绘图

  • 可视化在数据分析的每个步骤中都非常重要,在理解或清理数据时,可视化有助于识别数据中的趋势,比如我们计算了每一年的平均寿命:
global_yearly_life_expectancy=df.groupby('year')['lifeExp'].mean()
print(global_yearly_life_expectancy)

  • 可以通过plot函数画图,通过图片更直观的得出结论
global_yearly_life_expectancy.plot()

小结

本节课程介绍了如何使用Pandas的DataFrame加载数据,并介绍了如何对数据进行简单的分组聚合

pd.read_csv # 加载CSV文件
pd.loc      # 从DataFrame中获取部分数据,传入索引名字
pd.iloc     # 从DataFrame中获取部分数据,传入索引序号
pd.groupby  # 分组

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值