前言
不做笔记我就贼难受,算了算了还是写一下吧,
又是一个没有学过统计学出来招摇撞骗的噗嗤,学pandas明明是为了DataFrame结果你告诉我你连Excel表格都不会用【迫真
文章素材来自莫烦大大,莫烦大大好像也是看了Gitbook的,so.....
我的思路是绝对不会受到影响的我路子那么野qwq
Okay,there we GGGO!
0x01pandas到底是什么
Excel表格懂吧,把他当做一种数据结构,就是pandas了【精不精辟?】
pandas适合于许多不同类型的数据,包括:
- 具有异构类型列的表格数据,例如SQL表格或Excel数据
有序和无序(不一定是固定频率)时间序列数据。- 具有行列标签的任意矩阵数据(均匀类型或不同类型)
- 任何其他形式的观测/统计数据集。
我们主要用到的就是pandas里面两个类型:Series和DataFrance
这里要说一下英文的拼写问题,当你要定义这两个类型的时候.....
记得大写字母
记得大写字母
记得大写字母
重要的事情说三遍都不算多
还有一个事情:
不要tmd把Series(串联)拼成Serious或者Serise(严肃的,还有一个是我经常拼写错的,习惯性以为se在后面)
附:pip安装pandas【用Anaconda从来没有安装过包的笑嘻嘻】
pip3 install pandas
0x02 Series串联
想一想串联在数学上的意义是什么......就是一个一维数组嘛
唯一与array不同的一点是:串联可以自定义标签,或者另外一个词叫‘数组下标’
>>> import numpy as np
>>> import pandas as pd
#定义方法
>>> array1 = np.array([1,2,3,4])
>>> series1 = pd.Series([1,2,3,4]) #注意这里要大写
>>> array1
array([1, 2, 3, 4])
>>> series1
0 1
1 2
2 3
3 4
dtype: int64
#下标访问
>>> array1[1]
2
>>> series1[1]
2
那么我刚刚说的骚操作更改下标是什么呢,我们可以尝试一下使用values和index属性来查看一下【我我我真的只是尝试】
>>> series1.values
array([1, 2, 3, 4], dtype=int64)
>>> series1.index
RangeIndex(start=0, stop=4, step=1)
既然有这个属性,那么我们就肯定可以自定义!【确信】
自定义方法不难推测,根据上面.index里面返回的值发现,其实里面放了一个range来生成数组下表,尝试一下修改srart起始数使得下表从1开始
好吧其实不行,因为index里面必须要填入一个列表来着
#着算一个伪方法吧,唯一美中不足的地方就是需要提前定义values列表然后取len值
>>> series1 = pd.Series([1,2,3,4],index=(list(range(1,5))))
>>> series1
1 1
2 2
3 3
4 4
dtype: int64
#数组下标访问测试
>>> series1[1]
1
nice!
接下来进行一些骚操作,比如把下标换成英文字母
>>> series1 = pd.Series([1,2,3,4],index=['A','B','C','D'])
>>> series1
A 1
B 2
C 3
D 4
dtype: int64
>>> series1['A']
1
哇哦哦哦,然后呢
恭喜你已经基本掌握了Series的基本用法qwq
接下来是.....
0x03 DataFrame数据表?
好吧这个名字是我自己发明的辣【表示有道还有Bing都没有查到中文意思】
其实用起来跟Excel差不多,只不过是你自己定义了一个二维或多维数组【难不成你会用表格存一维的数据吗那我要你这个表格有何用直接上Series不就行了】
好的为了生成一个DataFrame你需要准备什么??
- 一个已经reshape好的多维数组
- 一个对应行的list
- 一个对应列的list
- 手和Python环境
当然了你也没有一定要定义行标签和列标签【强迫症保护协会表示严重谴责】
比如直接用一个reshape好的array生成一个DataFrame(注意大写字母)
>>> array2=arange(16).reshape(4,4)
>>> DataFrame1 =pd.DataFrame(array2)
>>> DataFrame1
0 1 2 3
0 0 1 2 3
1 4 5 6 7
2 8 9 10 11
3 12 13 14 15
这里有的眼尖的同学已经发现了多了几个0,1,2,3,那些就是行标签和列标签
我来尝试访问一下:
>>> DataFrame1.columns
RangeIndex(start=0, stop=4, step=1)
>>> DataFrame1.index
RangeIndex(start=0, stop=4, step=1)
下面我们来自定义,定义方法和之前的Series一样的,都是直接写属性名=
>>> DataFrame1 = pd.DataFrame(array2,
columns=["column1", "column2", "column3", "column4"],
index=["a", "b", "c", "d"])
>>> DataFrame1
column1 column2 column3 column4
a 0 1 2 3
b 4 5 6 7
c 8 9 10 11
d 12 13 14 15
如果用多维数组可以创建DataFrame,那么字典呢
其实在DataFrame里面使用字典的好处就是可以自定义每一列的内容
但是就不能判断行的内容辣
>>> DataFrame2 = pd.DataFrame({"note" : ["C", "D", "E", "F", "G", "A", "B"],
... "weekday": ["Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun"]})
>>> DataFrame2
note weekday
0 C Mon
1 D Tue
2 E Wed
3 F Thu
4 G Fri
5 A Sat
6 B Sun
噗嗤,那么说了多维数组和字典,还有什么漏掉了.....
Series??
害怕了,我去试试,就用刚刚我上面定义的Series1
>>> DataFrame3 = pd.DataFrame(series1)
>>> DataFrame3
0
A 1
B 2
C 3
D 4
这里是一个Series,但是如果使用多个呢?会发现一个很有趣的现象:
>>> noteSeries = pd.Series(["C", "D", "E", "F", "G", "A", "B"],
... index=[1, 2, 3, 4, 5, 6, 7])
>>> weekdaySeries = pd.Series(["Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun"],
... index=[1, 2, 3, 4, 5, 6, 7])
>>> df4 = pd.DataFrame([noteSeries, weekdaySeries])
>>> df4
1 2 3 4 5 6 7
0 C D E F G A B
1 Mon Tue Wed Thu Fri Sat Sun
这里Series被作为行来添加了呢是不是很莫名其妙
其实是因为这些Series没有被定义index,然后DataFrame要求绝对对齐,所以emmm
如果把不同len的series放在一起很有可能会出现无效值:
>>> df4 = pd.DataFrame([noteSeries, weekdaySeries,series1])
>>> df4
1 2 3 4 5 6 7 A B C D
0 C D E F G A B NaN NaN NaN NaN
1 Mon Tue Wed Thu Fri Sat Sun NaN NaN NaN NaN
2 NaN NaN NaN NaN NaN NaN NaN 1.0 2.0 3.0 4.0
这里DataFrame为了对齐就把很多的长度强行补齐,导致的就是很多的无效值影响阅读
小标题1:如何删改DataFrame里面的值?
你看Series都可以用数组下标访问,那么在Series里面不也是一样的嘛?
>>> df3 = pd.DataFrame({"note" : ["C", "D", "E", "F", "G", "A", "B"],
... "weekday": ["Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun"]})
>>> df3
note weekday
0 C Mon
1 D Tue
2 E Wed
3 F Thu
4 G Fri
5 A Sat
6 B Sun
>>> df3["No."] = pd.Series([1, 2, 3, 4, 5, 6, 7])#添加列数据
>>> df3
note weekday No.
0 C Mon 1
1 D Tue 2
2 E Wed 3
3 F Thu 4
4 G Fri 5
5 A Sat 6
6 B Sun 7
>>> del df3["weekday"] #删除列数据
>>> df3
note No.
0 C 1
1 D 2
2 E 3
3 F 4
4 G 5
5 A 6
6 B 7
小标题2:既然你可以删改数据那么怎么访问到我需要删改的数据呢?
在DataFrame里面有两种访问数据的方法,其中一种是通过像二位数据一样的数组下标,还有一种是通过行和列的标签
- loc:通过行和列的索引来访问数据
- iloc:通过行和列的下标来访问数据
我们在使用的时候只需要在列表的后面添加上对应的类型名(是loc还是iloc?)就可以实现访问和修改了
>>> df3.loc[[0, 1], "note"]
0 C
1 D
Name: note, dtype: object
>>> df3.iloc[[0, 1], 0]
0 C
1 D
Name: note, dtype: object
'''
第一行代码访问了行索引为0和1,列索引为“note”的元素。
第二行代码访问了行下标为0和1
对于df3来说,行索引和行下标刚好是一样的,所以这里都是0和1,但它们却是不同的含义
'''
最后
好了,第一期的DataFrame用时一个周末完成了噗嗤
接下来又是永无止境的填坑吧qwq,害怕了
参考资料:
Python数据处理库pandas入门教程
Pandas 基本介绍
Gitbook-Pandas 官方教程
网友评论