前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Pandas学习笔记01-基础知识

Pandas学习笔记01-基础知识

作者头像
可以叫我才哥
发布2021-08-05 11:18:19
7400
发布2021-08-05 11:18:19
举报
文章被收录于专栏:可以叫我才哥
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官网文档
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-06-07,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 可以叫我才哥 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1、Pandas模块安装与导入
  • 2、基础数据结构
    • 2.1、Series
      • 2.2、DataFrame
      • 3、数据载入及存储
        • 3.1、数据载入
          • 3.2、数据存储
          • 4、基础功能
            • 4.1、数据抽样
              • 4.2、描述统计
                • 4.3、计数
                  • 4.4、唯一值
                    • 4.5、索引标签
                      • 4.6、索引位置
                        • 4.7、累计值
                          • 4.8、排序与排名
                          相关产品与服务
                          数据保险箱
                          数据保险箱(Cloud Data Coffer Service,CDCS)为您提供更高安全系数的企业核心数据存储服务。您可以通过自定义过期天数的方法删除数据,避免误删带来的损害,还可以将数据跨地域存储,防止一些不可抗因素导致的数据丢失。数据保险箱支持通过控制台、API 等多样化方式快速简单接入,实现海量数据的存储管理。您可以使用数据保险箱对文件数据进行上传、下载,最终实现数据的安全存储和提取。
                          领券
                          问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档