Pandas学习笔记01-基础知识

2021-08-05 11:18:19 浏览数 (1)

pandas 是基于NumPy 的一种工具,该工具是为了解决数据分析任务而创建的。Pandas 纳入了大量库和一些标准的数据模型,提供了高效地操作大型数据集所需的工具。pandas提供了大量能使我们快速便捷地处理数据的函数和方法.

基础知识

1、Pandas模块安装与导入

在命令行使用conda或pip直接安装

代码语言:javascript复制
# conda
conda install pandas
代码语言:javascript复制
# or PyPI
pip install pandas

导入pandas

代码语言:javascript复制
import pandas as pd

查看pands版本号

代码语言:javascript复制
>>>pd.__version__
'1.0.3'

2、基础数据结构

Series:它是一种类似于一维数组的对象,是由一组数据(各种NumPy数据类型)以及一组与之相关的数据标签(即索引)组成。仅由一组数据也可产生简单的Series对象。

DataFrame:它是Pandas中的一个表格型的数据结构,包含有一组有序的列,每列可以是不同的值类型(数值、字符串、布尔型等),DataFrame即有行索引也有列索引,可以被看做是由Series组成的字典。

2.1、Series

①创建Series 最简单的Series可以仅仅由一个数组构成:

代码语言:javascript复制
>>>s1 = pd.Series([1,3,5,7,8,6,4,2])
>>>s1
Out[1]: 
0    1
1    3
2    5
3    7
4    8
5    6
6    4
7    2
dtype: int64

一般来说,一个Series有如下几类属性:值(values)、索引(index)、名称(name)和值类型(dtype) (对于未对索引index赋值的情况下,默认的索引是从0到n-1,参考s1)

代码语言:javascript复制
>>>s2 = pd.Series(np.random.randn(5),index=['a','b','c','d','e'],name='Series名称',dtype='float64')
>>>s2
Out[2]: 
a   -0.713666
b    1.026233
c    0.646062
d    0.686324
e   -0.000624
Name: Series名称, dtype: float64

②访问Series的属性

代码语言:javascript复制
>>>s2.values
Out[3]: 
array([-7.13666297e-01,  1.02623313e 00,  6.46061700e-01,  6.86323877e-01,
       -6.23616275e-04])

>>>s2.index
Out[4]: Index(['a', 'b', 'c', 'd', 'e'], dtype='object')

>>>s2.name
Out[5]: 'Series名称'

>>>s2.dtype
Out[6]: dtype('float64')

③数据索引 对于设置了索引的Series,我们可以通过索引标签进行数据索引;对于未设置索引的Series,我们可以通过iloc进行数据索引。

代码语言:javascript复制
>>>s2['a']
Out[7]: -0.7136662966055275

>>>s1.iloc[1]
Out[8]: 3
2.2、DataFrame

①创建DataFrame 有较多方式创建DataFrame,比较简单的就是使用包含等长列表或NumPy数组的字典。

代码语言:javascript复制
>>>data = {'列1':list('abcde'),
'列2':list('ABCDE'),
'列3':range(5)}
>>>df = pd.DataFrame(data)
>>>df
Out[9]: 
  列1 列2  列3
0  a  A   0
1  b  B   1
2  c  C   2
3  d  D   3
4  e  E   4

和Series类型,未设置索引的时候,默认索引是0到n-1,我们在创建的时候亦可对索引进行赋值。

代码语言:javascript复制
>>>df = pd.DataFrame(data,index = ['2020','2019','2018','2017','2016'])
>>>df
Out[10]: 
     列1 列2  列3
2020  a  A   0
2019  b  B   1
2018  c  C   2
2017  d  D   3
2016  e  E   4

②访问DataFrame属性 DataFrame属性包含值(values)、索引(index)、列名(columns)和形状(shape)

代码语言:javascript复制
>>>df.values
Out[11]: 
array([['a', 'A', 0],
       ['b', 'B', 1],
       ['c', 'C', 2],
       ['d', 'D', 3],
       ['e', 'E', 4]], dtype=object)

>>>df.index
Out[12]: Index(['2020', '2019', '2018', '2017', '2016'], dtype='object')

>>>df.columns
Out[13]: Index(['列1', '列2', '列3'], dtype='object')

>>>df.shape
Out[14]: (5, 3)

③从DataFrame取出一列

代码语言:javascript复制
#采用字典类型标记形式
>>>df['列1']
Out[15]: 
2020    a
2019    b
2018    c
2017    d
2016    e
Name: 列1, dtype: object
#采用属性形式
>>>df.列1
Out[16]: 
2020    a
2019    b
2018    c
2017    d
2016    e
Name: 列1, dtype: object
#以上方式获取的是Series,以下方式获取的还是DataFrame类型
>>>df[['列1']]
Out[17]: 
     列1
2020  a
2019  b
2018  c
2017  d
2016  e

④修改行或列名

代码语言:javascript复制
>>>df.rename(index={'2020':'今年'},columns={'列1':'第1列'})
Out[18]: 
     第1列 列2  列3
今年     a  A   0
2019   b  B   1
2018   c  C   2
2017   d  D   3
2016   e  E   4

⑤新增或删除列 新增列 常规方式是在最后一列后面新增一列,用insert方法可以在指定位置新增列。

代码语言:javascript复制
>>>df['列4'] = list('panda')
>>>df
Out[19]: 
     列1 列2  列3 列4
2020  a  A   0  p
2019  b  B   1  a
2018  c  C   2  n
2017  d  D   3  d
2016  e  E   4  a

>>>df.insert(loc=0,column='列',value=6)
>>>df
Out[20]: 
      列 列1 列2  列3 列4
2020  6  a  A   0  p
2019  6  b  B   1  a
2018  6  c  C   2  n
2017  6  d  D   3  d
2016  6  e  E   4  a

删除列 常见的有drop、del或pop

代码语言:javascript复制
#drop返回删除后的结果,但是原DataFrame数据不变,若需要改变,可以设置参数inplace=True
>>>df.drop(index = '2020')
Out[21]: 
      列 列1 列2  列3 列4
2019  6  b  B   1  a
2018  6  c  C   2  n
2017  6  d  D   3  d
2016  6  e  E   4  a

>>>df.drop(columns = '列')
Out[22]: 
     列1 列2  列3 列4
2020  a  A   0  p
2019  b  B   1  a
2018  c  C   2  n
2017  d  D   3  d
2016  e  E   4  a

>>>del df['列4']
>>>df
Out[23]: 
      列 列1 列2  列3
2020  6  a  A   0
2019  6  b  B   1
2018  6  c  C   2
2017  6  d  D   3
2016  6  e  E   4
#pop返回被删的列,且原数据表会被改变
>>>df.pop('列3')
Out[24]: 
2020    0
2019    1
2018    2
2017    3
2016    4
Name: 列3, dtype: int64
>>>df
Out[25]: 
      列 列1 列2
2020  6  a  A
2019  6  b  B
2018  6  c  C
2017  6  d  D
2016  6  e  E

⑥转置(调换行和列)

代码语言:javascript复制
>>>df.T
Out[26]: 
   2020 2019 2018 2017 2016
列     6    6    6    6    6
列1    a    b    c    d    e
列2    A    B    C    D    E
列3    0    1    2    3    4
列4    p    a    n    d    a

3、数据载入及存储

3.1、数据载入

read_csv:csv文件 read_table:txt文件 read_excel:excel文件 数据载入基本形式是一致的,不分开做详细介绍,这里以excel文件为例。

代码语言:javascript复制
>>>df1 = pd.read_excel(r"F:Pandas学习笔记创造营2020名单.xlsx")
#head()是只取前5行数据预览,第4节会介绍
>>>df1.head()
Out[27]: 
   当前排名     选手编号    选手姓名  ... face  AI预测年龄 face  女性眼中颜值 face  男性眼中颜值
0     1  1585086  希林娜依·高  ...           21       82.632       81.007
1     2  8261593     陈卓璇  ...           25       84.332       84.493
2     3  8284576     郑乃馨  ...           25       89.641       87.146
3     4  8268050     张艺凡  ...           23       68.897       67.156
4     5  8262415     刘些宁  ...           22       90.795       89.127

[5 rows x 14 columns]
3.2、数据存储

to_csv::存储为csv文件 to_excel:存储为xlsx或xls文件

代码语言:javascript复制
>>>df2 = df1.head()
>>>df2.to_excel(r'F:Pandas学习笔记创造营2020前5名单.xlsx',index = 0)

index = 0 表示存储的时候去掉索引列

4、基础功能

4.1、数据抽样

head:获取前5行,亦可指定行数

代码语言:javascript复制
>>>df1.head()
Out[74]: 
   当前排名     选手编号    选手姓名  ... face  AI预测年龄 face  女性眼中颜值 face  男性眼中颜值
0     1  1585086  希林娜依·高  ...           21       82.632       81.007
1     2  8261593     陈卓璇  ...           25       84.332       84.493
2     3  8284576     郑乃馨  ...           25       89.641       87.146
3     4  8268050     张艺凡  ...           23       68.897       67.156
4     5  8262415     刘些宁  ...           22       90.795       89.127

[5 rows x 14 columns]

df1.head(1)
Out[75]: 
   当前排名     选手编号    选手姓名  ... face  AI预测年龄 face  女性眼中颜值 face  男性眼中颜值
0     1  1585086  希林娜依·高  ...           21       82.632       81.007

[1 rows x 14 columns]

tail:获取最后5行,亦可指定行数

代码语言:javascript复制
df1.tail()
Out[76]: 
     当前排名     选手编号 选手姓名  ... face  AI预测年龄 face  女性眼中颜值 face  男性眼中颜值
96     97  8284635  谢安诗  ...           22       83.490       87.417
97     98  8286012  赵天爱  ...           27       84.367       78.586
98     99  8284673   温馨  ...           29       88.302       84.751
99    100  8284636  黄雨晴  ...           25       87.413       87.136
100   101  8284694  胡娅楠  ...           19       80.098       79.712

[5 rows x 14 columns]

df1.tail(1)
Out[77]: 
     当前排名     选手编号 选手姓名  ... face  AI预测年龄 face  女性眼中颜值 face  男性眼中颜值
100   101  8284694  胡娅楠  ...           19       80.098       79.712

[1 rows x 14 columns]

sample:随机抽取1行,亦可指定行数

代码语言:javascript复制
df1.sample()
Out[78]: 
    当前排名     选手编号 选手姓名  ... face  AI预测年龄 face  女性眼中颜值 face  男性眼中颜值
96    97  8284635  谢安诗  ...           22        83.49       87.417

[1 rows x 14 columns]

df1.sample(3)
Out[79]: 
    当前排名     选手编号 选手姓名  ... face  AI预测年龄 face  女性眼中颜值 face  男性眼中颜值
60    61  8284688  袁嘉艺  ...           22       88.240       85.138
74    75  8284664  黄碧茵  ...           22       88.983       91.982
14    15  8286058   姚慧  ...           52       83.418       81.636

[3 rows x 14 columns]
4.2、描述统计

info:返回每列的列名、非空值数量以及该列的数据类型

代码语言:javascript复制
>>>df1.info()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 101 entries, 0 to 100
Data columns (total 14 columns):
 #   Column        Non-Null Count  Dtype  
---  ------        --------------  -----  
 0   当前排名          101 non-null    int64  
 1   选手编号          101 non-null    int64  
 2   选手姓名          101 non-null    object 
 3   选手照片          101 non-null    object 
 4   选手状态          101 non-null    object 
 5   粉丝数           101 non-null    object 
 6   星座            101 non-null    object 
 7   身高            30 non-null     float64
 8   体重            15 non-null     object 
 9   出生地           101 non-null    object 
 10  生日            101 non-null    object 
 11  face  AI预测年龄  101 non-null    int64  
 12  face  女性眼中颜值  101 non-null    float64
 13  face  男性眼中颜值  101 non-null    float64
dtypes: float64(3), int64(3), object(8)
memory usage: 11.2  KB

describe:计算各列(dtype是数字类型)的统计集合

代码语言:javascript复制
>>>df1.describe()
Out[86]: 
             当前排名          选手编号  ...  face  女性眼中颜值  face  男性眼中颜值
count  101.000000  1.010000e 02  ...    101.000000    101.000000
mean    51.000000  7.261909e 06  ...     85.051089     83.899931
std     29.300171  2.456086e 06  ...      4.691681      4.560872
min      1.000000  3.109500e 05  ...     68.897000     67.156000
25%     26.000000  8.278365e 06  ...     82.632000     81.398000
50%     51.000000  8.284651e 06  ...     86.053000     84.493000
75%     76.000000  8.284677e 06  ...     88.367000     87.146000
max    101.000000  8.286058e 06  ...     95.230000     93.773000
4.3、计数

①count:计算每列非NA值的个数

代码语言:javascript复制
>>>df1.count()
Out[87]: 
当前排名            101
选手编号            101
选手姓名            101
选手照片            101
选手状态            101
粉丝数             101
星座              101
身高               30
体重               15
出生地             101
生日              101
face  AI预测年龄    101
face  女性眼中颜值    101
face  男性眼中颜值    101
dtype: int64

②value_counts:计算某列各元素出现的次数

代码语言:javascript复制
>>>df1['星座'].value_counts()
Out[91]: 
-      36
天秤座     8
摩羯座     7
射手座     7
双子座     7
狮子座     7
金牛座     6
白羊座     5
天蝎座     5
双鱼座     4
处女座     3
巨蟹座     3
水瓶座     3
Name: 星座, dtype: int64
4.4、唯一值

①unique:计算某列的所有唯一值,并返回

代码语言:javascript复制
>>>df1['身高'].unique()
Out[93]: 
array([ nan, 168., 175., 166., 167., 170., 158., 164., 172., 171., 160.,
       165., 163., 162., 173., 169.])

②nunique:非重复计数

代码语言:javascript复制
>>>df1['身高'].nunique()
Out[94]: 15
4.5、索引标签

由于df1的索引是简单的0-100,我们在df上做演示,先给df新增一列

代码语言:javascript复制
>>>df['列3'] = np.random.randint(12,size = 5)
>>>df
Out[120]: 
      列 列1 列2  列3
2020  6  a  A   8
2019  6  b  B  11
2018  6  c  C  10
2017  6  d  D   3
2016  6  e  E   9

①idxmin:计算最小值所在的索引标签

代码语言:javascript复制
>>>df['列3'].idxmax()
Out[121]: '2019'

②idxmax:计算最大值所在的索引标签

代码语言:javascript复制
>>>df['列3'].idxmin()
Out[122]: '2017'
4.6、索引位置

①argmin:计算最小值所在的索引位置

代码语言:javascript复制
>>>df1['身高'].argmin()
Out[97]: 8
#查看第8行数据,后续章节会详细介绍索引
>>>df1.iloc[8]
Out[98]: 
当前排名                                                            9
选手编号                                                      1661521
选手姓名                                                          林君怡
选手照片            https://vfiles.gtimg.cn/vupload/202005/9936b41...
选手状态                                                           撑腰
粉丝数                                                        143.3万
星座                                                            双子座
身高                                                            158
体重                                                           46kg
出生地                                                            北京
生日                                            1999-06-14 00:00:00
face  AI预测年龄                                                   26
face  女性眼中颜值                                                85.15
face  男性眼中颜值                                               85.034
Name: 8, dtype: object

②argmax:计算最大值所在的索引位置

代码语言:javascript复制
>>>df1['身高'].argmax()
Out[103]: 3

>>>df1.iloc[[3]]
Out[104]: 
   当前排名     选手编号 选手姓名  ... face  AI预测年龄 face  女性眼中颜值 face  男性眼中颜值
3     4  8268050  张艺凡  ...           23       68.897       67.156

[1 rows x 14 columns]
4.7、累计值

①cumsum:计算累计值

代码语言:javascript复制
>>>df.cumsum()
Out[124]: 
       列     列1     列2  列3
2020   6      a      A   8
2019  12     ab     AB  19
2018  18    abc    ABC  29
2017  24   abcd   ABCD  32
2016  30  abcde  ABCDE  41

②cummin:计算累计值的最小值

代码语言:javascript复制
>>>df.cummin()
Out[125]: 
      列 列1 列2  列3
2020  6  a  A   8
2019  6  a  A   8
2018  6  a  A   8
2017  6  a  A   3
2016  6  a  A   3

③cummax:计算累计值的最大值

代码语言:javascript复制
>>>df.cummax()
Out[126]: 
      列 列1 列2  列3
2020  6  a  A   8
2019  6  b  B  11
2018  6  c  C  11
2017  6  d  D  11
2016  6  e  E  11
4.8、排序与排名

①sort_index:按照索引排序

代码语言:javascript复制
#默认是从小到大排序
>>>df1.sort_index()
Out[127]: 
     当前排名     选手编号    选手姓名  ... face  AI预测年龄 face  女性眼中颜值 face  男性眼中颜值
0       1  1585086  希林娜依·高  ...           21       82.632       81.007
1       2  8261593     陈卓璇  ...           25       84.332       84.493
2       3  8284576     郑乃馨  ...           25       89.641       87.146
3       4  8268050     张艺凡  ...           23       68.897       67.156
4       5  8262415     刘些宁  ...           22       90.795       89.127
..    ...      ...     ...  ...          ...          ...          ...
96     97  8284635     谢安诗  ...           22       83.490       87.417
97     98  8286012     赵天爱  ...           27       84.367       78.586
98     99  8284673      温馨  ...           29       88.302       84.751
99    100  8284636     黄雨晴  ...           25       87.413       87.136
100   101  8284694     胡娅楠  ...           19       80.098       79.712

[101 rows x 14 columns]
#ascending=False 表示排序由从大到小
>>>df1.sort_index(ascending=False)
Out[129]: 
     当前排名     选手编号    选手姓名  ... face  AI预测年龄 face  女性眼中颜值 face  男性眼中颜值
100   101  8284694     胡娅楠  ...           19       80.098       79.712
99    100  8284636     黄雨晴  ...           25       87.413       87.136
98     99  8284673      温馨  ...           29       88.302       84.751
97     98  8286012     赵天爱  ...           27       84.367       78.586
96     97  8284635     谢安诗  ...           22       83.490       87.417
..    ...      ...     ...  ...          ...          ...          ...
4       5  8262415     刘些宁  ...           22       90.795       89.127
3       4  8268050     张艺凡  ...           23       68.897       67.156
2       3  8284576     郑乃馨  ...           25       89.641       87.146
1       2  8261593     陈卓璇  ...           25       84.332       84.493
0       1  1585086  希林娜依·高  ...           21       82.632       81.007

[101 rows x 14 columns]

②sort_values:按照某列的值排序

代码语言:javascript复制
>>>df1.sort_values(by = 'face  男性眼中颜值',ascending=False)
Out[133]: 
    当前排名     选手编号 选手姓名  ... face  AI预测年龄 face  女性眼中颜值 face  男性眼中颜值
24    25  1484179  孙珍妮  ...           22       94.688       93.773
95    96  8284668  黄若元  ...           25       95.230       92.934
74    75  8284664  黄碧茵  ...           22       88.983       91.982
18    19  8284687   康汐  ...           23       91.894       90.210
12    13  8284640   拉娜  ...           22       90.340       89.620
..   ...      ...  ...  ...          ...          ...          ...
47    48  8286040  王丽娜  ...           23       76.467       74.745
30    31  8286044  仲菲菲  ...           22       70.254       72.432
78    79  8284677  潘小雪  ...           25       74.820       71.095
15    16  8284675  田京凡  ...           23       70.329       70.337
3      4  8268050  张艺凡  ...           23       68.897       67.156

[101 rows x 14 columns]

③rank:排名 参数:

Signature: df.rank( axis=0, method: str = 'average', numeric_only: Union[bool, NoneType] = None, na_option: str = 'keep', ascending: bool = True, pct: bool = False, )

axis 默认为0,按列排序;1代表按照行排序 method方法:排序时同等排名的计算方式 ascending:排序方式(默认为小到大)

代码语言:javascript复制
>>>df
Out[135]: 
      列 列1 列2  列3
2020  6  a  A   8
2019  6  b  B  11
2018  6  c  C  10
2017  6  d  D   3
2016  6  e  E   9

>>>df.rank()
Out[136]: 
        列   列1   列2   列3
2020  3.0  1.0  1.0  2.0
2019  3.0  2.0  2.0  5.0
2018  3.0  3.0  3.0  4.0
2017  3.0  4.0  4.0  1.0
2016  3.0  5.0  5.0  3.0

>>>df.rank(method='min')
Out[137]: 
        列   列1   列2   列3
2020  1.0  1.0  1.0  2.0
2019  1.0  2.0  2.0  5.0
2018  1.0  3.0  3.0  4.0
2017  1.0  4.0  4.0  1.0
2016  1.0  5.0  5.0  3.0

>>>df.rank(method='max')
Out[138]: 
        列   列1   列2   列3
2020  5.0  1.0  1.0  2.0
2019  5.0  2.0  2.0  5.0
2018  5.0  3.0  3.0  4.0
2017  5.0  4.0  4.0  1.0
2016  5.0  5.0  5.0  3.0

>>>df.rank(axis = 1)
Out[140]: 
        列   列3
2020  1.0  2.0
2019  1.0  2.0
2018  1.0  2.0
2017  2.0  1.0
2016  1.0  2.0

参考资料:

  1. 利用Python进行数据分析(第二版)
  2. Pandas Cookbook
  3. Pandas官网文档

0 人点赞