基础知识
在命令行使用conda或pip直接安装
# conda
conda install pandas
# or PyPI
pip install pandas
导入pandas
import pandas as pd
查看pands版本号
>>>pd.__version__
'1.0.3'
Series:它是一种类似于一维数组的对象,是由一组数据(各种NumPy数据类型)以及一组与之相关的数据标签(即索引)组成。仅由一组数据也可产生简单的Series对象。
DataFrame:它是Pandas中的一个表格型的数据结构,包含有一组有序的列,每列可以是不同的值类型(数值、字符串、布尔型等),DataFrame即有行索引也有列索引,可以被看做是由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
①创建DataFrame 有较多方式创建DataFrame,比较简单的就是使用包含等长列表或NumPy数组的字典。
>>>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,我们在创建的时候亦可对索引进行赋值。
>>>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)
>>>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列 列2 列3
今年 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]:
列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
#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
⑥转置(调换行和列)
>>>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
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]
to_csv::存储为csv文件 to_excel:存储为xlsx或xls文件
>>>df2 = df1.head()
>>>df2.to_excel(r'F:\Pandas学习笔记\创造营2020前5名单.xlsx',index = 0)
index = 0 表示存储的时候去掉索引列
①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]
①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
①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
①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
由于df1的索引是简单的0-100,我们在df上做演示,先给df新增一列
>>>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:计算最小值所在的索引标签
>>>df['列3'].idxmax()
Out[121]: '2019'
②idxmax:计算最大值所在的索引标签
>>>df['列3'].idxmin()
Out[122]: '2017'
①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]
①cumsum:计算累计值
>>>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:计算累计值的最小值
>>>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:计算累计值的最大值
>>>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
①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]:
列 列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
参考资料: