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 # 分组
411

被折叠的 条评论
为什么被折叠?



