————————————————

快速入门pandas使用

一小时快速入门Pandas


什么是Pandas?

pandas与numpy,scipy一样,都是优秀的python开源数据分析库,为python编程语言提供高性能,易于使用的数据结构和数据分析工具。

Pandas安装

如果你已经安装了Anaconda,那么你无需安装Pandas,直接进入下一步即可。

如果你没有安装Anaconda,你也可使用如下方法安装pandas,强烈推荐安装Anaconda。

python3 -m pip install --upgrade pandas
pip install Pandas

更多了解

详见Pandas中文网,本教程也均来自此:Pandas 中文 (pypandas.cn)

导入Pandas库

无论你使用什么进行Pandas的数据分析,在程序的开头,我们首先要像numpy一样导入库,这样我们才能使用来自pandas中的丰富功能

import pandas as pd

这样我们就已经成功导入了pandas,我们可以开始快速入门pandas了!

生成Pandas对象

在Pandas中,我们最常见的操作对象就是Series和Dataframe这两个对象,我们首先开始创建Series对象。

使用pd.Series方法,通过传入参数的方式可以创建Series,结果以列表方式返回

 s = pd.Series([1, 3, 5, np.nan, 6, 8])
0    1.0
1    3.0
2    5.0
3    NaN
4    6.0
5    8.0
dtype: float64

接着我们创建Dataframe对象,要创建DataFrame对象,我们要指定索引Index和值,我们首先生成dates,然后让index等于dates,再传入我们的值就可以得到dataframe对象

dates = pd.date_range('20130101', periods=6)
df = pd.DataFrame(np.random.randn(6, 4), index=dates, columns=list('ABCD'))
print(df)

得到:


                   A         B         C         D
2013-01-01  0.469112 -0.282863 -1.509059 -1.135632
2013-01-02  1.212112 -0.173215  0.119209 -1.044236
2013-01-03 -0.861849 -2.104569 -0.494929  1.071804
2013-01-04  0.721555 -0.706771 -1.039575  0.271860
2013-01-05 -0.424972  0.567020  0.276232 -1.087401
2013-01-06 -0.673690  0.113648 -1.478427  0.524988

我们还可以用Series 字典对象生成 DataFrame

df2 = pd.DataFrame({'A': 1.,
   ...:                     'B': pd.Timestamp('20130102'),
   ...:                     'C': pd.Series(1, index=list(range(4)), dtype='float32'),
   ...:                     'D': np.array([3] * 4, dtype='int32'),
   ...:                     'E': pd.Categorical(["test", "train", "test", "train"]),
   ...:                     'F': 'foo'})
   ...: 

得到:

 
     A          B    C  D      E    F
0  1.0 2013-01-02  1.0  3   test  foo
1  1.0 2013-01-02  1.0  3  train  foo
2  1.0 2013-01-02  1.0  3   test  foo
3  1.0 2013-01-02  1.0  3  train  foo

我们可以通过dtypes方法查看dataframe的数据类型组成

A           float64
B    datetime64[ns]
C           float32
D             int32
E          category
F            object
dtype: object

查看dataframe数据

我们首先使用head方法查看头部数据

df.head()

得到头部数据:

                   A         B         C         D
2013-01-01  0.469112 -0.282863 -1.509059 -1.135632
2013-01-02  1.212112 -0.173215  0.119209 -1.044236
2013-01-03 -0.861849 -2.104569 -0.494929  1.071804
2013-01-04  0.721555 -0.706771 -1.039575  0.271860
2013-01-05 -0.424972  0.567020  0.276232 -1.087401

使用tail查看尾部数据

df.tail(3)

得到尾部数据:

                   A         B         C         D
2013-01-04  0.721555 -0.706771 -1.039575  0.271860
2013-01-05 -0.424972  0.567020  0.276232 -1.087401
2013-01-06 -0.673690  0.113648 -1.478427  0.524988

显示索引与列名,我们使用Index和columns方法

df.index

索引:

DatetimeIndex(['2013-01-01', '2013-01-02', '2013-01-03', '2013-01-04',
               '2013-01-05', '2013-01-06'],
              dtype='datetime64[ns]', freq='D')

columns方法:

df.columns
#返回
Index(['A', 'B', 'C', 'D'], dtype='object')

Pandas 和 NumPy 的本质区别:NumPy 数组只有一种数据类型,DataFrame 每列的数据类型各不相同

DataFrame.to_numpy方法可以将dataframe格式转换为Numpy格式,在处理某些数据类型的时候,numpy确实要比pandas要快得多。

提醒

DataFrame.to_numpy的输出不包含行索引和列标签。

describe方法可以快速查看数据的统计摘要

df.describe()

              A         B         C         D
count  6.000000  6.000000  6.000000  6.000000
mean   0.073711 -0.431125 -0.687758 -0.233103
std    0.843157  0.922818  0.779887  0.973118
min   -0.861849 -2.104569 -1.509059 -1.135632
25%   -0.611510 -0.600794 -1.368714 -1.076610
50%    0.022070 -0.228039 -0.767252 -0.386188
75%    0.658444  0.041933 -0.034326  0.461706
max    1.212112  0.567020  0.276232  1.071804

转置数据

df.T

按轴排序(axis=0是行,axis=1是列)

df.sort_index(axis=1, ascending=False)

                   D         C         B         A
2013-01-01 -1.135632 -1.509059 -0.282863  0.469112
2013-01-02 -1.044236  0.119209 -0.173215  1.212112
2013-01-03  1.071804 -0.494929 -2.104569 -0.861849
2013-01-04  0.271860 -1.039575 -0.706771  0.721555
2013-01-05 -1.087401  0.276232  0.567020 -0.424972
2013-01-06  0.524988 -1.478427  0.113648 -0.673690

按值排序

df.sort_values(by='B')

                   A         B         C         D
2013-01-03 -0.861849 -2.104569 -0.494929  1.071804
2013-01-04  0.721555 -0.706771 -1.039575  0.271860
2013-01-01  0.469112 -0.282863 -1.509059 -1.135632
2013-01-02  1.212112 -0.173215  0.119209 -1.044236
2013-01-06 -0.673690  0.113648 -1.478427  0.524988
2013-01-05 -0.424972  0.567020  0.276232 -1.087401

这里以后会介绍推荐优化过的 Pandas 数据访问方法:.at.iat.loc.iloc

缺失值

Pandas 主要用 np.nan 表示缺失数据, 计算时,默认不包含空值。

重建索引(reindex)可以更改、添加、删除指定轴的索引,并返回数据副本,即不更改原数据。

简而言之,reindex可以快速找出我们需要的数据,且其操作不是在原数据上直接进行的。

df1 = df.reindex(index=dates[0:4], columns=list(df.columns) + ['E'])

注意这里的index只保留了0到4行。然后在原始columns的基础上新加了E这一列

df1.loc[dates[0]:dates[1], 'E'] = 1

然后使用loc(可以理解为切片,与numpy切片的概念是相同的)函数,使在第一行第二行的E这一列的值为1

                   A         B         C  D    F    E
2013-01-01  0.000000  0.000000 -1.509059  5  NaN  1.0
2013-01-02  1.212112 -0.173215  0.119209  5  1.0  1.0
2013-01-03 -0.861849 -2.104569 -0.494929  5  2.0  NaN
2013-01-04  0.721555 -0.706771 -1.039575  5  3.0  NaN

然后我们删除所有含有缺失值的行

df1.dropna(how='any')

dropna是pandas中删除缺失值的函数,里面的参数any是删除所有带有缺失值的行


                   A         B         C  D    F    E
2013-01-02  1.212112 -0.173215  0.119209  5  1.0  1.0

我们还需要一个用来填充缺失值的函数fillna

df1.fillna(value=5)

                   A         B         C  D    F    E
2013-01-01  0.000000  0.000000 -1.509059  5  5.0  1.0
2013-01-02  1.212112 -0.173215  0.119209  5  1.0  1.0
2013-01-03 -0.861849 -2.104569 -0.494929  5  2.0  5.0
2013-01-04  0.721555 -0.706771 -1.039575  5  3.0  5.0

这里将value设置为5,意思是让所有的缺失值填充为5

我们通过isna方法可以快速判断值是否为缺失值,该方法返回一个布尔矩阵

pd.isna(df1)
                A      B      C      D      F      E
2013-01-01  False  False  False  False   True  False
2013-01-02  False  False  False  False  False  False
2013-01-03  False  False  False  False  False   True
2013-01-04  False  False  False  False  False   True

统计

我们通常使用mean方法来进行描述性统计

df.mean()

A   -0.004474
B   -0.383981
C   -0.687758
D    5.000000
F    3.000000
dtype: float64

在另一个轴(即,行)上执行同样的操作:

df.mean(1)

2013-01-01    0.872735
2013-01-02    1.431621
2013-01-03    0.707731
2013-01-04    1.395042
2013-01-05    1.883656
2013-01-06    1.592306
Freq: D, dtype: float64

合并(Merge)

Pandas 提供了多种将 Series、DataFrame 对象组合在一起的功能,用索引与关联代数功能的多种设置逻辑可执行连接(join)与合并(merge)操作。

concat方法

concat经常用于连接 Pandas 对象

我们首先将原来完整的数据进行切片

df = pd.DataFrame(np.random.randn(10, 4)) #生成一个随机dataframe
pieces = [df[:3], df[3:7], df[7:]]        #切片分组

然后我们使用concat函数,里面传入pieces切片,concat将自动按顺序为我们合并

pd.concat(pieces)

          0         1         2         3
0 -0.548702  1.467327 -1.015962 -0.483075
1  1.637550 -1.217659 -0.291519 -1.745505
2 -0.263952  0.991460 -0.919069  0.266046
3 -0.709661  1.669052  1.037882 -1.705775
4 -0.919854 -0.042379  1.247642 -0.009920
5  0.290213  0.495767  0.362949  1.548106
6 -1.131345 -0.089329  0.337863 -0.945867
7 -0.932132  1.956030  0.017587 -0.016692
8 -0.575247  0.254161 -1.143704  0.215897
9  1.193555 -0.077118 -0.408530 -0.862495

连接(join)

下面是sql风格的连接操作:

left = pd.DataFrame({'key': ['foo', 'foo'], 'lval': [1, 2]})
right = pd.DataFrame({'key': ['foo', 'foo'], 'rval': [4, 5]})
left:

   key  lval
0  foo     1
1  foo     2

right:

   key  rval
0  foo     4
1  foo     5

pd.merge(left, right, on='key')
#得到
   key  lval  rval
0  foo     1     4
1  foo     1     5
2  foo     2     4
3  foo     2     5

追加(Append)

为 DataFrame 追加行

df = pd.DataFrame(np.random.randn(8, 4), columns=['A', 'B', 'C', 'D'])

df

          A         B         C         D
0  1.346061  1.511763  1.627081 -0.990582
1 -0.441652  1.211526  0.268520  0.024580
2 -1.577585  0.396823 -0.105381 -0.532532
3  1.453749  1.208843 -0.080952 -0.264610
4 -0.727965 -0.589346  0.339969 -0.693205
5 -0.339355  0.593616  0.884345  1.591431
6  0.141809  0.220390  0.435589  0.192451
7 -0.096701  0.803351  1.715071 -0.708758

s = df.iloc[3]

df.append(s, ignore_index=True)

          A         B         C         D
0  1.346061  1.511763  1.627081 -0.990582
1 -0.441652  1.211526  0.268520  0.024580
2 -1.577585  0.396823 -0.105381 -0.532532
3  1.453749  1.208843 -0.080952 -0.264610
4 -0.727965 -0.589346  0.339969 -0.693205
5 -0.339355  0.593616  0.884345  1.591431
6  0.141809  0.220390  0.435589  0.192451
7 -0.096701  0.803351  1.715071 -0.708758
8  1.453749  1.208843 -0.080952 -0.264610

在这个例子中,我们首先创建一个dataframe然后,将使用切片将前三列取走,最后使用追加函数将第四列追加在前三列的末尾。

分组(Grouping)

  • 分割:按条件把数据分割成多组;
  • 应用:为每组单独应用函数;
  • 组合:将处理结果组合成一个数据结构。
In [91]: df = pd.DataFrame({'A': ['foo', 'bar', 'foo', 'bar',
   ....:                          'foo', 'bar', 'foo', 'foo'],
   ....:                    'B': ['one', 'one', 'two', 'three',
   ....:                          'two', 'two', 'one', 'three'],
   ....:                    'C': np.random.randn(8),
   ....:                    'D': np.random.randn(8)})
   ....: 

df

     A      B         C         D
0  foo    one -1.202872 -0.055224
1  bar    one -1.814470  2.395985
2  foo    two  1.018601  1.552825
3  bar  three -0.595447  0.166599
4  foo    two  1.395433  0.047609
5  bar    two -0.392670 -0.136473
6  foo    one  0.007207 -0.561757
7  foo  three  1.928123 -1.623033

生成了一含有不同数据类型的dataframe

先分组,再用 sum函数计算每组的汇总数据:

df.groupby('A').sum()

            C        D
A                     
bar -2.802588  2.42611
foo  3.146492 -0.63958

多列分组后,生成多层索引,也可以应用 sum函数:

df.groupby(['A', 'B']).sum()

                  C         D
A   B                        
bar one   -1.814470  2.395985
    three -0.595447  0.166599
    two   -0.392670 -0.136473
foo one   -1.195665 -0.616981
    three  1.928123 -1.623033
    two    2.414034  1.600434

Pandas时间序列

pandas时间序列不是基础操作的重点,想进一步深入了解的伙伴可以继续阅读

十分钟入门 Pandas | Pandas 中文 (pypandas.cn)和《利用python进行数据分析》这本书,我在以后也会陆续更新这本书的内容。


总结

这些知识大概一个小时即可阅读完毕,这些都是pandas最基础的操作,加下来我会陆续总结在数学建模实战中的Pandas操作,在八月后期我也会更新赛题的数据分析操作,也算对自己学习经验的实践。

感谢您阅读到这里,我非常希望和大家深入技术交流,我自己现在的技术也是很菜,多交流多学习才有可能进步。

posted @ 2021-08-07 14:34  Nova_TI  阅读(97)  评论(0)    收藏  举报
————————————————