暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Python数据分析笔记#6.1 Pandas-数据结构

Yuan的学习笔记 2021-10-08
290



「目录」

  • 6.1 => Pandas的数据结构

    -------->Series

    -------->DataFrame

  • 6.2 => 数据分析和处理

  • 6.3 => 数学和统计方法


pandas是什么?具体的可以自己上网查资料,这里简单说一下吧。

pandas是基于Numpy为解决数据分析任务而创建的。

  • pandas提供了大量能使我们快速便捷地处理数据的函数和方法。
  • pandas含有使数据清洗(data clean)和分析⼯作变得更快更简单的数据结构和操作⼯具。

pandas会经常和其它⼯具⼀同使⽤,如数值计算⼯具NumPy和SciPy,分析库 Statsmodels和Scikit-learn,和数据可视化库Matplotlib。

你很快就会发现它有多强大和好用!

Pandas和Numpy的不同:Pandas是专门为处理表格和混杂数据设计的,NumPy更适合处理统⼀的数值数组数据。

一般以下面的方式导入pandas:

In [1]: import pandas as pd


Pandas的数据结构

Pandas的两个主要的数据结构:序列Series和数据框架DataFrame

Series

Series是类似于⼀维数组的对象,它由⼀组数据和数据的的标签(即索引)组成。

In [2]: obj = pd.Series([4, 7, -5, 3])

In [3]: obj
Out[3]:
0    4
1    7
2   -5
3    3
dtype: int64

Series中,索引Index在左边,值Value在右边。

若没有为数据指定索引,会自动创建一个整数索引。

我们可以通过Series的values属性获取数组的值

In [4]: obj.values
Out[4]: array([ 4,  7, -5,  3], dtype=int64)

还可以通过Series的index属性获取数组的索引

In [5]: obj.index
Out[5]: RangeIndex(start=0, stop=4, step=1)

我们当然可以自定义自己创建的Series的索引:

In [6]: obj2 = pd.Series([1, 2, 3, 4], index=['a''b''c''d'])

In [7]: obj2
Out[7]:
a    1
b    2
c    3
d    4
dtype: int64

通过索引的方式选取Series中单个值或一组值:

In [8]: obj2['a']
Out[8]: 1

In [9]: obj2[['c''a''d']]
Out[9]:
c    3
a    1
d    4
dtype: int64

或用布尔型数组过滤:

In [10]: obj2[obj2>2]
Out[10]:
c    3
d    4
dtype: int64

还有别的类似于对Numpy数组的操作,比如对整个Series值乘以2:

In [11]: obj2 * 2
Out[11]:
a    2
b    4
c    6
d    8
dtype: int64

当有一组数据放在字典里时,我们可以直接通过字典来创建Series。


比如我们有四个一线城市及其人口(单位万)的数据{'Shanghai':2418, 'Beijing':2154, 'Guangzhou':1490, 'Shenzhen':1253}

In [15]: sdata = {'Shanghai':2418, 'Beijing':2154, 'Guangzhou':1490, 'Shenzhen':1253}

In [16]: obj3 = pd.Series(sdata, index=sdata)

In [17]: obj3
Out[17]:
Shanghai     2418
Beijing      2154
Guangzhou    1490
Shenzhen     1253
dtype: int64

也可以自己传入索引来改变顺序

In [18]: states =['Shenzhen''Guangzhou''Beijing''Shanghai']

In [19]: obj3 = pd.Series(sdata, index=states)

In [20]: obj3
Out[20]:
Shenzhen     1253
Guangzhou    1490
Beijing      2154
Shanghai     2418
dtype: int64

如果传入了没有的键,由于在sdata中找不到对应的值,所以结果为NaN(not a number)

In [21]: states =['Shenzhen''Guangzhou''Beijing''Shanghai''Chengdu']

In [22]: obj4 = pd.Series(sdata, index=states)

In [23]: obj4
Out[23]:
Shenzhen     1253.0
Guangzhou    1490.0
Beijing      2154.0
Shanghai     2418.0
Chengdu         NaN
dtype: float64

Pandas的isnullnotnull可以检测缺失数据

In [24]: pd.isnull(obj4)
Out[24]:
Shenzhen     False
Guangzhou    False
Beijing      False
Shanghai     False
Chengdu       True
dtype: bool

In [25]: pd.notnull(obj4)
Out[25]:
Shenzhen      True
Guangzhou     True
Beijing       True
Shanghai      True
Chengdu      False
dtype: bool

或者使用Series的实例方法:

In [26]: obj.isnull()
Out[26]:
0    False
1    False
2    False
3    False
dtype: bool


DataFrame

DataFrame是⼀个表格型的数据结构,它含有⼀组有序的列,每列可以是不同的值类型(数值、字符串、布尔值等)。

DataFrame既有行索引也有列索引,它可以被看做由Series组成的字典(共⽤同⼀个索引)。

最常用的建立DataFrame的方式是传入一个等长的列表或Numpy数组:

In [2]: data = {'state':['Ohio''Ohio''Ohio''Nevada''Nevada''Nevada'],^M
   ...:         'year':[2000, 2001, 2002, 2001, 2002, 2003],^M
   ...:         'pop':[1.5, 1.7, 3.6, 2.4, 2.9, 3.2]}

In [3]: frame = pd.DataFrame(data)

In [4]: frame
Out[4]:
    state  year  pop
0    Ohio  2000  1.5
1    Ohio  2001  1.7
2    Ohio  2002  3.6
3  Nevada  2001  2.4
4  Nevada  2002  2.9
5  Nevada  2003  3.2

如果使用Jupyter Notebook,Pandas DataFrame对象会以对浏览器有好的HTML表格的方式呈现


使用head方法可以显示前5行

In [5]: frame.head()
Out[5]:
    state  year  pop
0    Ohio  2000  1.5
1    Ohio  2001  1.7
2    Ohio  2002  3.6
3  Nevada  2001  2.4
4  Nevada  2002  2.9


我们也可以指定列的排列顺序:

In [6]: pd.DataFrame(data, columns=['year''state''pop'])
Out[6]:
   year   state  pop
0  2000    Ohio  1.5
1  2001    Ohio  1.7
2  2002    Ohio  3.6
3  2001  Nevada  2.4
4  2002  Nevada  2.9
5  2003  Nevada  3.2


如果要获取某一列可以像下面这么做:

In [7]: frame['state']
Out[7]:
0      Ohio
1      Ohio
2      Ohio
3    Nevada
4    Nevada
5    Nevada
Name: state, dtype: object

获取某一行的话可以用loc属性:

In [8]: frame.loc[2]
Out[8]:
state    Ohio
year     2002
pop       3.6
Name: 2, dtype: object

如果想给这个DataFrame加一个新列,比如美国各个州的GDP:

In [11]: frame['GDP'] = np.arange(1,7)

In [12]: frame
Out[12]:
    state  year  pop  GDP
0    Ohio  2000  1.5    1
1    Ohio  2001  1.7    2
2    Ohio  2002  3.6    3
3  Nevada  2001  2.4    4
4  Nevada  2002  2.9    5
5  Nevada  2003  3.2    6


不想要了?可以使用del删除

In [13]: del frame['GDP']

In [14]: frame
Out[14]:
    state  year  pop
0    Ohio  2000  1.5
1    Ohio  2001  1.7
2    Ohio  2002  3.6
3  Nevada  2001  2.4
4  Nevada  2002  2.9
5  Nevada  2003  3.2


如果创建DataFrame时传入的是嵌套字典,则外层字典的键作为列索引,内层键则作为行索引:

In [15]: pop = {'Nevada':{2001:2.4, 2002:2.9}, 'Ohio':{2000:1.5, 2001:1.7, 2002:3.6}}

In [16]: frame2 = pd.DataFrame(pop)

In [17]: frame2
Out[17]:
      Nevada  Ohio
2000     NaN   1.5
2001     2.4   1.7
2002     2.9   3.6

因为键'Nevada'的字典中找不到2000这个键,所以这个位置就是NaN

使用.T方法,可以调换DataFrame行索引和列索引的位置(就像Numpy数组的转置):

In [18]: frame2.T
Out[18]:
        2000  2001  2002
Nevada   NaN   2.4   2.9
Ohio     1.5   1.7   3.6


你可能想要在行索引(2000,2001,2002)上面写上年份year,可以设置DataFrame的index的name属性来实现:

In [19]: frame2.index.name = 'Year'

In [20]: frame2
Out[20]:
      Nevada  Ohio
Year
2000     NaN   1.5
2001     2.4   1.7
2002     2.9   3.6


列索引('Nevada','Ohio')旁也可以设置columns的name属性:

In [21]: frame2.columns.name = 'State'

In [22]: frame2
Out[22]:
State  Nevada  Ohio
Year
2000      NaN   1.5
2001      2.4   1.7
2002      2.9   3.6


剧透一下(以后具体讲),一个很方便的可视化DataFrame的方法:

df.T.plot.bar(rot=0)

Note: rot(rotation)可以更改下面标签的倾斜度


values属性会以二维数组ndarray的形式返回DataFrame中的数据

In [23]: frame2.values
Out[23]:
array([[nan, 1.5],
       [2.4, 1.7],
       [2.9, 3.6]])







往期回顾


Numpy中的随机数





Stay hungry, stay foolish





快来,点在看啦

文章转载自Yuan的学习笔记,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论