我爱编程

2018-04-07-不会统计学的Pandas入门(一)

2018-04-09  本文已影响0人  0xC00005

前言

不做笔记我就贼难受,算了算了还是写一下吧,

又是一个没有学过统计学出来招摇撞骗的噗嗤,学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好的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?)就可以实现访问和修改了

>>> 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 官方教程

最后的最后

这个小姐姐更新博客很勤的你真的人心不来看看嘛

上一篇下一篇

猜你喜欢

热点阅读