《爱上潘大师》系列-你还记得那年的DataFrame吗
![](https://img.haomeiwen.com/i19993290/6649e0447114d46b.png)
2020,努力做一个无可替代的人!
写在前面的话
如果你还记得那年大明湖畔的xiaoyige,那你就应该来看看这篇文章
我们学的是技术,小一我写的可是技术文章,哪来那么多情啊爱啊的
今天的内容很重要的!
先复习一下前面的文章:
可能有的同学不理解复习的意义,我简单说一下:
我写系列文章的时候都会先列好整个系列的大纲,甚至有时候几篇文章是同一天肝出来的。
这就造成有时候这一篇文章的概念会及其依赖上一篇文章,所以呢,花个两三分钟复习一下上一篇,你会更好理解这篇文章。
正文
今天介绍潘大师的另一种数据结构:Dataframe,一个表格型的数据结构。
对于Series 我们只用了一小节介绍,而Dataframe 可能会用三节内容,孰轻孰重应该都清楚吧
学习DataFrame,小一建议你最好和Excel表格联系起来
Excel 表格有行索引、列索引,有数据块,有数据的查找、替换、去重,有数据的透视,汇总,有不同表的数据匹配等等这些。
DataFrame 的初衷就是为了解决这些问题,简洁、易用的功能也是作者最初的愿景
所以 ,后面的系列文章,如果你对某个概念不是很理解,想一想 Excel 中是怎么表述的
创建 DataFrame
先来一个DataFrame 介绍三连
DataFrame 有行(索引)、有列(索引),可以看做是由一个个的Series 组成的字典。
DataFrame 每列可以是不同的值类型(数值、字符串、布尔值)
DataFrame 中的数据是以一个或多个二维块存放的
那DataFrame 都有哪些创建方式?
和NumPy 一样,DataFrame 创建方式也有很多种
常见的有:
-
通过二维ndarray 创建
-
通过字典创建
-
通过列表创建
-
通过另一个DataFrame 创建
下面简单介绍一下常用的,剩下的同学们自己拓展
通过二维ndarray创建DataFrame
创建一个二维的ndarray 数组,该数组即DataFrame 的数据集
# 通过二维ndarray创建DataFrame
arr_data = np.arange(12).reshape(3, 4)
df_data1 = pd.DataFrame(arr_data)
# 输出
0 1 2 3
0 0 1 2 3
1 4 5 6 7
2 8 9 10 11
结果DataFrame 会自动加上行索引和列索引,和Series 的创建一样
那应该怎么显示声明行、列索引?
也和Series 的创建一样,在创建的时候手动指定就行
# 通过二维ndarray创建DataFrame
columns = ['one', 'two', 'three', 'four']
index = ['a', 'b', 'c']
# 显示指定行、列索引
df_data1 = pd.DataFrame(arr_data, columns=columns, index=index)
# 输出
one two three four
a 0 1 2 3
b 4 5 6 7
c 8 9 10 11
记住列索引(想要成Excel 的列名):columns
行索引(想象成Excel 的序号):index
默认的行列索引都是从0开始
通过字典创建DataFrame
这里面的字典包括很多,比如:
- 数组、元祖 、列表 组成的字典
- 字典组成的字典(嵌套)
- Series 组成的字典
只要数据是字典格式,就可以做数据集
字典的key作为DataFrame的行索引
# 通过字典创建DataFrame
dict_data = {
'name': ['xiaoyi', 'xiaosi', 'xiaoqi'],
'age': [11, 14, 17],
'score': [95.5, 94.5, 97]
}
df_data2 = pd.DataFrame(dict_data)
# 输出
name age score
0 xiaoyi 11 95.5
1 xiaosi 14 94.5
2 xiaoqi 17 97.0
列索引是字典的 key 值,行索引自动填充
当然字典里面的值数据类型你可以尽情变化,Series、元祖、列表等都是可以的
通过列表创建DataFrame
同样的,这里的列表类型也不止一种:
- 字典组成的列表
- Series 组成的列表
# 通过列表创建DataFrame
list_data = [
{'one': 1, 'two': 2},
{'one': 1, 'two': 2, 'three': 4}
]
df_data3 = pd.DataFrame(list_data)
# 输出
one two three
0 1 2 NaN
1 1 2 4.0
主要就是这三种创建方式,有些书上写的过于复杂,让人眼花缭乱
万变不离其宗,核心就是这三种
至于第四种通过其他DataFrame创建,就不多说了吧?
经常读我文章的同学要是会了前三种,还不会第四种?
不妨看一下NumPy 的数组创建?顺便反思一下?
索引对象
DataFrame 已经创建好了,但是索引还不太明白,是和Series的一样吗?
能想到Series,说明你差不多都知道是怎么回事了
构建Series 或者DataFrame 时,所用到的任何数据的标签都会被转换成Index对象
Index 对象是不可修改的,这样可以保证多个数据结构之间的安全共享
毕竟人家可是索引,你索引要是都一样了,那到底应该指向谁就说不清了
我们可以使用重新索引的方法 reindex
reindex 的用处相当大,我详细介绍一下参数
reindex(index, method, fille_value, limit, level, copy)
参数 | 说明 |
---|---|
index | 用作索引的新序列 |
method | 插值(填充)方式,包括:ffill(前向填充值)、bfill(后向填充值) |
fill_value | 在重新索引的过程中,需要引入缺失值时使用的替代值 |
limit | 前向或后向填充时的最大填充量 |
在DataFrame中,存在行、列索引,不同于Series 中只有单一索引。
所以DataFrame中 reindex 可以行、列索引都修改
先看单一索引
# 创建 Series
series_data = pd.Series([1, 2, 4, 5], index=['a', 'b', 'c', 'e'])
# 输出
a 1
b 2
c 4
e 5
dtype: int64
# 重新索引
series_data = series_data.reindex(['a', 'b', 'c', 'd', 'e'], fill_value=-1)
# 输出
a 1
b 2
c 4
d -1
e 5
dtype: int64
reindex 会根据新索引进行重排,如果某个索引值不存在,则使用 fille_value 的值进行填充
还记得前面说的DataFrame 中行、列索引分别是什么吗?
- 行索引:index (想象成Excel 中的序号)
- 列索引:columns (想象成Excel 中的列标签)
df_data2
# 输出
name age score
0 xiaoyi 11 95.5
1 xiaosi 14 94.5
2 xiaoqi 17 97.0
# 行、列重新索引
columns = ['name', 'age', 'score', 'score2']
index = [0, 1, 2, 3]
df_data2 = df_data2.reindex(index=index, columns=columns)
# 输出
name age score score2
0 xiaoyi 11.0 95.5 NaN
1 xiaosi 14.0 94.5 NaN
2 xiaoqi 17.0 97.0 NaN
3 NaN NaN NaN NaN
对行、列都进行重新索引,索引值不存在的会用空值填充
索引很重要,是Pandas 数据模型的重要部分,但是我们了解上面的内容就够了,也没必要去深究它。
总结一下:
今天主要介绍了DataFrame 的创建和索引的相关操作。
创建方法也是一如既往的多,不过不要慌,真正用起来的时候基本都是从文件中读数据,就一个方法。
索引这一块不要搞混行索引、列索引。
对于索引的一些方法最好是掌握,我写出来的都是常用的,不是常用的我也懒得写,你要是还纠结那就查API 文档细品吧
写在后面的话
每天进步一点点,学习不就是这么来的吗?
写这篇文章的时候,我接到了一个关系很好的朋友的消息。
他的考研成绩公布了,边工作边复习的他,考研历程是我认识的人中最艰难的、最辛苦的。
等他有空,我去取取经,投稿部分应该会有新文章,期待一下
碎碎念一下
上一节碎碎念太多,一下没控制住自己
算算时间,去年十二月份定下的小目标:每周两篇原创文 ,除了春节期间,应该都实现了。
原创不易,欢迎点赞噢
文章首发:公众号【知秋小一】
文章同步:掘金,简书,csdn