基础知识
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
参考资料:
- 利用Python进行数据分析(第二版)
- Pandas Cookbook
- Pandas官网文档