前言
- pandas,python+data+analysis的组合缩写,是python中基于numpy和matplotlib的第三方数据分析库,与后两者共同构成了python数据分析的基础工具包,享有数分三剑客之名。
文章开始前,需要进行库的安装:
打开cmd,依次输入以下三个命令即可。
pip install pandas -i https://pypi.tuna.tsinghua.edu.cn/simple pip install numpy -i https://pypi.tuna.tsinghua.edu.cn/simple pip install matplotlib -i https://pypi.tuna.tsinghua.edu.cn/simple
这里使用的是清华源,提高安装速度。
一、series
series是一个一维数组,线性的数据结构。
1、创建一个series数据(默认索引值)
- 使用
pandas.Series()
函数
import pandas as pd # 创建一个series数据,默认索引值 s1 = pd.Series([1, 3, 14, 521]) print(s1)
输出:
0 1 1 3 2 14 3 521 dtype: int64
提示:命名文件的时候文件命不要以pandas
命名。
2、创建一个series数据(自定义默认值)
import pandas as pd # 创建一个series数据,索引值自定义 s2 = pd.Series([1, 3, 14, 521], index=['第一个数', '第二个数', '第三个数', '第四个数']) print(s2)
输出:
第一个数 1 第二个数 3 第三个数 14 第四个数 521 dtype: int64
3、获取series的数据值
- 使用
pandas.values()
函数
import pandas as pd # 提取series的数据的值 s3 = pd.Series([1, 3, 14, 521]) # 直接获取值 print(s3.values) print('-------分割线-------') # 根据索引获取值 print(s3[0:3])
输出:
[ 1 3 14 521] -------分割线------- 0 1 1 3 2 14 dtype: int64
4、用字典来构建一个series数据
series可以看作一个定长的有序字典
import pandas as pd dict = {"数学": 130, "专业课": 140, "政治": 80, "英语": 70} s4 = pd.Series(dict) print(s4)
输出:
数学 130 专业课 140 政治 80 英语 70 dtype: int64
二、DataFrame
1、创建一个DataFrame数据
- 使用
pandas.DataFrame
函数
①:
import pandas as pd data = { 'class': [1, 2, 3, 4], 'people': [16, 15, 17, 18] } df1 = pd.DataFrame(data) print(df1)
输出:
class people 0 1 16 1 2 15 2 3 17 3 4 18
②:利用np.arange()
函数,用法可参考np.arange()用法
import pandas as pd import numpy as np df2 = pd.DataFrame(np.arange(8).reshape(2, 4)) print(df2)
输出:
0 1 2 3 0 0 1 2 3 1 4 5 6 7
2、自定义行和列的值
import pandas as pd import numpy as np df3 = pd.DataFrame(np.arange(8).reshape(2, 4), index=['a', 'b'], columns=['11', '22', '33', '44']) print(df3)
输出:
11 22 33 44 a 0 1 2 3 b 4 5 6 7
3、获取值、行索引、列索引、转置
- 使用
values
、index
、columns
、axes
、T
import pandas as pd import numpy as np df4 = pd.DataFrame(np.arange(8).reshape(2, 4), index=['a', 'b'], columns=['11', '22', '33', '44']) print('--------原数据-------') print(df4) print('-------获取值--------') print(df4.values) print('-------获取行索引--------') print(df4.index) print('-------获取列索引--------') print(df4.columns) print('-------获取行及列的索引值--------') print(df4.axes) print('-------获取转置-------') print(df4.T)
输出:
--------原数据------- 11 22 33 44 a 0 1 2 3 b 4 5 6 7 -------获取值-------- [[0 1 2 3] [4 5 6 7]] -------获取行索引-------- Index(['a', 'b'], dtype='object') -------获取列索引-------- Index(['11', '22', '33', '44'], dtype='object') -------获取行及列的索引值-------- [Index(['a', 'b'], dtype='object'), Index(['11', '22', '33', '44'], dtype='object')] -------获取转置值------- a b 11 0 4 22 1 5 33 2 6 44 3 7
4、获取统计变量
- 使用
pandas.describe()
函数
import pandas as pd data = {'year': [2018, 2019, 2020, 2021], 'income': [10000, 20000, 30000, 40000], 'pay': [5000, 15000, 20000, 30000] } df5 = pd.DataFrame(data) print(df5.describe())
输出:
year income pay count 4.000000 4.000000 4.000000 mean 2019.500000 25000.000000 17500.000000 std 1.290994 12909.944487 10408.329997 min 2018.000000 10000.000000 5000.000000 25% 2018.750000 17500.000000 12500.000000 50% 2019.500000 25000.000000 17500.000000 75% 2020.250000 32500.000000 22500.000000 max 2021.000000 40000.000000 30000.000000
注解:
count:数量统计,此列共有多少有效值 mean:均值 std:标准差 min:最小值 25%:四分之一分位数 50%:二分之一分位数 75%:四分之三分位数 max:最大值
5、根据行、列、值进行排序
- 使用
sort_index()
、sort_values()
import pandas as pd import numpy as np df6 = pd.DataFrame(np.arange(8).reshape(2, 4), index=['b', 'a'], columns=['22', '11', '44', '33']) print('--------原数据-------') print(df6) print('--------行排序-------') print(df6.sort_index(axis=0)) print('--------列排序-------') print(df6.sort_index(axis=1)) print('--------值排序(对33列里的值进行排序)-------') print(df6.sort_values(by='33'))
输出:
--------原数据------- 22 11 44 33 b 0 1 2 3 a 4 5 6 7 --------行排序------- 22 11 44 33 a 4 5 6 7 b 0 1 2 3 --------列排序------- 11 22 33 44 b 1 0 3 2 a 5 4 7 6 --------值排序(对33列里的值进行排序)------- 22 11 44 33 b 0 1 2 3 a 4 5 6 7
三、pandas选择数据
import pandas as pd import numpy as np dates = pd.date_range('20210301', periods=6) df1 = pd.DataFrame(np.arange(24).reshape((6, 4)), index=dates, columns=['A', 'B', 'C', 'D']) print(df1)
输出:
A B C D 2021-03-01 0 1 2 3 2021-03-02 4 5 6 7 2021-03-03 8 9 10 11 2021-03-04 12 13 14 15 2021-03-05 16 17 18 19 2021-03-06 20 21 22 23
- 注:以下所有操作均以上述结果为基础
1、获取一列的series数据和行数据
print('----将DataFrame的一个列获取为一个series数据----') a = df1.A # 或者写成 df1['A'] print(a) print('-------获取前两行数据------') print(df1[0:2])
输出:
----将DataFrame的一个列获取为一个series数据---- 2021-03-01 0 2021-03-02 4 2021-03-03 8 2021-03-04 12 2021-03-05 16 2021-03-06 20 Freq: D, Name: A, dtype: int32 -------获取前两行数据------ A B C D 2021-03-01 0 1 2 3 2021-03-02 4 5 6 7
2、通过标签获取数据
- 使用
loc
print('------行标签-----') print(df1.loc['20210302']) print('------行和列混合标签--------') print(df1.loc['20210301', ['A', 'C']]) print('-------全选行但不全选列-------') print(df1.loc[:, ['A', 'C']]) print('-------全选列但不全选行-------') print(df1.loc[['20210302', '20210304'], :])
输出:
------行标签----- A 4 B 5 C 6 D 7 Name: 2021-03-02 00:00:00, dtype: int32 ------行和列混合标签-------- A 0 C 2 Name: 2021-03-01 00:00:00, dtype: int32 -------全选行但不全选列------- A C 2021-03-01 0 2 2021-03-02 4 6 2021-03-03 8 10 2021-03-04 12 14 2021-03-05 16 18 2021-03-06 20 22 -------全选列但不全选行------- A B C D 2021-03-02 4 5 6 7 2021-03-04 12 13 14 15
3、通过位置获取数据
- 使用
iloc
print('-------第四行------') print(df1.iloc[3]) print('-------二到三行,三到四列------') print(df1.iloc[1:3, 2:4]) print('-------第2,3,4行,3、4列') print(df1.iloc[[1, 2, 3], [2, 3]])
输出:
-------第四行------ A 12 B 13 C 14 D 15 Name: 2021-03-04 00:00:00, dtype: int32 -------二到三行,三到四列------ C D 2021-03-02 6 7 2021-03-03 10 11 -------第2,3,4行,3、4列 C D 2021-03-02 6 7 2021-03-03 10 11 2021-03-04 14 15
4、对某一列的数据进行判断
print(df1.A) print('---------------------分割线--------------------') print(df1.A > 6)
输出:
2021-03-01 0 2021-03-02 4 2021-03-03 8 2021-03-04 12 2021-03-05 16 2021-03-06 20 Freq: D, Name: A, dtype: int32 ---------------------分割线-------------------- 2021-03-01 False 2021-03-02 False 2021-03-03 True 2021-03-04 True 2021-03-05 True 2021-03-06 True Freq: D, Name: A, dtype: bool
四、pandas赋值及操作
import pandas as pd import numpy as np dates = pd.date_range('20210301', periods=6) df1 = pd.DataFrame(np.arange(24).reshape((6, 4)), index=dates, columns=['A', 'B', 'C', 'D']) print(df1)
输出:
A B C D 2021-03-01 0 1 2 3 2021-03-02 4 5 6 7 2021-03-03 8 9 10 11 2021-03-04 12 13 14 15 2021-03-05 16 17 18 19 2021-03-06 20 21 22 23
- 以下结果均为上述为基础
1、替换原有值
①根据位置替换数据
df1.iloc[1, 2] = 100 print(df1)
输出:
A B C D 2021-03-01 0 1 2 3 2021-03-02 4 5 100 7 2021-03-03 8 9 10 11 2021-03-04 12 13 14 15 2021-03-05 16 17 18 19 2021-03-06 20 21 22 23
②根据标签替换数据
df1.loc["20210304", 'B'] = 200 print(df1)
输出:
A B C D 2021-03-01 0 1 2 3 2021-03-02 4 5 6 7 2021-03-03 8 9 10 11 2021-03-04 12 200 14 15 2021-03-05 16 17 18 19 2021-03-06 20 21 22 23
③根据条件替换数据
Ⅰ.
df1[df1.D > 10] = 0 # df1.D > 10的作用是找到D列数据大于10的所有行数据 print(df1)
输出:
A B C D 2021-03-01 0 1 2 3 2021-03-02 4 5 6 7 2021-03-03 0 0 0 0 2021-03-04 0 0 0 0 2021-03-05 0 0 0 0 2021-03-06 0 0 0 0
Ⅱ.
df1.A[df1.A == 8] = 300 # 找到A列等于8的所有数据,并替换成300 print(df1)
输出:
A B C D 2021-03-01 0 1 2 3 2021-03-02 4 5 6 7 2021-03-03 300 9 10 11 2021-03-04 12 13 14 15 2021-03-05 16 17 18 19 2021-03-06 20 21 22 23
2、插入行、列
①通过series数据的形式插入
df1['F'] = pd.Series(['1', '2', '3', '4', '5', '6'], index=dates) print(df1)
输出:
A B C D F 2021-03-01 0 1 2 3 1 2021-03-02 4 5 6 7 2 2021-03-03 8 9 10 11 3 2021-03-04 12 13 14 15 4 2021-03-05 16 17 18 19 5 2021-03-06 20 21 22 23 6
②通过append
函数插入(行操作)
s = pd.Series([1, 2, 3, 4], index=['A', 'B', 'C', 'D']) s.name = 'new' df2 = df1.append(s) print(df2)
输出:
A B C D 2021-03-01 00:00:00 0 1 2 3 2021-03-02 00:00:00 4 5 6 7 2021-03-03 00:00:00 8 9 10 11 2021-03-04 00:00:00 12 13 14 15 2021-03-05 00:00:00 16 17 18 19 2021-03-06 00:00:00 20 21 22 23 new 1 2 3 4
③通过insert
函数插入(列操作)
df1.insert(2, 'E', [1, 2, 3, 4, 5, 6]) # 在第二列的右边插入一个新的E列 print(df1)
输出:
A B E C D 2021-03-01 0 1 1 2 3 2021-03-02 4 5 2 6 7 2021-03-03 8 9 3 10 11 2021-03-04 12 13 4 14 15 2021-03-05 16 17 5 18 19 2021-03-06 20 21 6 22 23
3、删除行、列
①删除行
df2 = df1.drop(dates[1], axis=0) print(df2)
输出:
A B C D 2021-03-01 0 1 2 3 2021-03-03 8 9 10 11 2021-03-04 12 13 14 15 2021-03-05 16 17 18 19 2021-03-06 20 21 22 23
我同时也试了另外一个例子,是可以运行的,请看:
import pandas as pd import numpy as np df1 = pd.DataFrame(np.arange(24).reshape((6, 4)), index=['1', '2', '3', '4', '5', '6'], columns=['A', 'B', 'C', 'D']) df2 = df1.drop('2', axis=0) # 删除‘2’行 print('--------------原数据--------------') print(df1) print('--------------删除后的数据-------------') print(df2)
输出:
--------------原数据-------------- A B C D 1 0 1 2 3 2 4 5 6 7 3 8 9 10 11 4 12 13 14 15 5 16 17 18 19 6 20 21 22 23 --------------删除后的数据------------- A B C D 1 0 1 2 3 3 8 9 10 11 4 12 13 14 15 5 16 17 18 19 6 20 21 22 23
这里是成功把‘2’这行给删除掉了。
②删除列
df2 = df1.drop('A', axis=1) # 删除A列 print(df2)
输出:
B C D 2021-03-01 1 2 3 2021-03-02 5 6 7 2021-03-03 9 10 11 2021-03-04 13 14 15 2021-03-05 17 18 19 2021-03-06 21 22 23
五、pandas对于空数据的处理
import pandas as pd import numpy as np dates = pd.date_range('20210301', periods=6) df1 = pd.DataFrame(np.arange(24).reshape((6, 4)), index=dates, columns=['A', 'B', 'C', 'D']) df2 = pd.DataFrame(df1, index=dates, columns=['A', 'B', 'C', 'D', 'E', 'F']) s1 = pd.Series([3, 4, 6, 7], index=dates[:4]) # 对第一个到第四个数据进行赋值 s2 = pd.Series([32, 5, 2, 1], index=dates[2:]) # 对第三个数据到最后一个数据进行赋值 df2['E'] = s1 df2['F'] = s2 print(df2)
输出:
A B C D E F 2021-03-01 0 1 2 3 3.0 NaN 2021-03-02 4 5 6 7 4.0 NaN 2021-03-03 8 9 10 11 6.0 32.0 2021-03-04 12 13 14 15 7.0 5.0 2021-03-05 16 17 18 19 NaN 2.0 2021-03-06 20 21 22 23 NaN 1.0
- 以下结果均为上述为基础
1、删除空值所在的行或者列
- 使用
dropna
函数
# axis中的0代表行,1代表列。how中的any表示,含有空值即删除 ,all代表全部为空值才删除 print(df2.dropna(axis=0, how='any'))
输出:
A B C D E F 2021-03-03 8 9 10 11 6.0 32.0 2021-03-04 12 13 14 15 7.0 5.0
2、对空值进行赋值
- 使用
fillna
函数
# 对空值进行赋值,此处赋值为100 print(df2.fillna(value=100))
输出:
A B C D E F 2021-03-01 0 1 2 3 3.0 100.0 2021-03-02 4 5 6 7 4.0 100.0 2021-03-03 8 9 10 11 6.0 32.0 2021-03-04 12 13 14 15 7.0 5.0 2021-03-05 16 17 18 19 100.0 2.0 2021-03-06 20 21 22 23 100.0 1.0
3、判断数据是否为空值
- 使用
isnull
函数,空值返回True,非空值返回Flase
print(df2.isnull())
输出:
A B C D E F 2021-03-01 False False False False False True 2021-03-02 False False False False False True 2021-03-03 False False False False False False 2021-03-04 False False False False False False 2021-03-05 False False False False True False 2021-03-06 False False False False True False