Pandas学习笔记01-基础盘点

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

前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。了解可点击查看
基础知识

1、Pandas模块安装与导入

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

# conda
conda install pandas
# or PyPI
pip install pandas

导入pandas

import pandas as pd

查看pands版本号

>>>pd.__version__
'1.0.3'

2、基础数据结构

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

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

2.1、Series

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

>>>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)

>>>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的属性

>>>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进行数据索引。

>>>s2['a']
Out[7]: -0.7136662966055275

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

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

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

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

>>>df = pd.DataFrame(data,index = ['2020','2019','2018','2017','2016'])
>>>df
Out[10]:123
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)

>>>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取出一列

#采用字典类型标记形式
>>>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

④修改行或列名

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

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

>>>df['列4'] = list('panda')
>>>df
Out[19]:1234
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]: 
      列 列1234
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

#drop返回删除后的结果,但是原DataFrame数据不变,若需要改变,可以设置参数inplace=True
>>>df.drop(index = '2020')
Out[21]: 
      列 列1234
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]:1234
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]: 
      列 列123
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]: 
      列 列12
2020  6  a  A
2019  6  b  B
2018  6  c  C
2017  6  d  D
2016  6  e  E

⑥转置(调换行和列)

>>>df.T
Out[26]: 
   2020 2019 2018 2017 20166    6    6    6    61    a    b    c    d    e
列2    A    B    C    D    E
列3    0    1    2    3    44    p    a    n    d    a

3、数据载入及存储

3.1、数据载入

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

>>>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文件

>>>df2 = df1.head()
>>>df2.to_excel(r'F:\Pandas学习笔记\创造营2020前5名单.xlsx',index = 0)

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

4、基础功能

4.1、数据抽样

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

>>>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行,亦可指定行数

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行,亦可指定行数

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:返回每列的列名、非空值数量以及该列的数据类型

>>>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是数字类型)的统计集合

>>>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值的个数

>>>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:计算某列各元素出现的次数

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

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

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

②nunique:非重复计数

>>>df1['身高'].nunique()
Out[94]: 15
4.5、索引标签

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

>>>df['列3'] = np.random.randint(12,size = 5)
>>>df
Out[120]: 
      列 列123
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:计算最小值所在的索引标签

>>>df['列3'].idxmax()
Out[121]: '2019'

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

>>>df['列3'].idxmin()
Out[122]: '2017'
4.6、索引位置

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

>>>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:计算最大值所在的索引位置

>>>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:计算累计值

>>>df.cumsum()
Out[124]: 
       列     列123
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:计算累计值的最小值

>>>df.cummin()
Out[125]: 
      列 列123
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:计算累计值的最大值

>>>df.cummax()
Out[126]: 
      列 列123
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:按照索引排序

#默认是从小到大排序
>>>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:按照某列的值排序

>>>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:排序方式(默认为小到大)

>>>df
Out[135]: 
      列 列123
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]: 
        列   列123
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]: 
        列   列123
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]: 
        列   列123
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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值