・在数据分析中,Pandas的使用频率很高
・Pandas可以说是基于NumPy构建的含有更高级数据结构和分析能力的工具包
・Series和DataFrame是两个核心数据结构,分别代表一维的序列和二维的表结构
・基于这两种数据结构,Pandas可以对数据进行导入、清洗、处理、统计和输出
・Series是个定长的字典序列
・在存储的时候,相当于两个ndarry,这也是和字典结构最大的不同。因为字典结构,元素个数是不固定的
・Series的两个基本属性:
①index
②values
举个实例,来看一下Series的使用方法:
- # -*- coding: utf-8 -*-
-
- """
- @ auth : carl_DJ
- @ time : 2020-8-28
- """
-
-
- from pandas import Series,DataFrame
-
- x1 = Series([1,2,3,4])
- x2 = Series(data=[1,2,3,4],index=['a','b','c','d'])
- #使用字典来创建
- d = {'a':1,'b':2,'c':3,'d':4}
- x3=Series(d)
- print(f'x1打印的结果是:{x1}' )
- print('='*20)
- print(f'x2打印的结果是:{x2}')
- print('='*20)
- print(f'x3打印的结果是:{x3}')
-
结果如下:
・类似数据库表,包括了行索引和列索引,可以将DataFrame看成是由相同索引的Series组成的字典类型
我们在举个例子:
- # -*- coding: utf-8 -*-
-
- """
- @ auth : carl_DJ
- @ time : 2020-8-28
- """
-
- from pandas import DataFrame
- data = {
- 'Chinese':[66,88,93,11,66],
- 'Math':[30,20,40,50,77],
- 'English':[65,88,90,55,22]
- }
- df1 = DataFrame(data)
- df2 = DataFrame(
- data,
- index=['张三','李四','王五','赵刘','贾七'],
- columns=['Chinese','Math','English']
- )
-
- print(f'df1打印的结果是:\n{df1}')
- print('='*30)
- print(f'df2打印的结果是:\n{df2}')
-
看一下效果
・删除DataFrame的 行与列
实例演示
- #删除行
- df2 = df2.drop(columns=['English'])
- #删列
- df2 = df2.drop(index=['张三'])
-
运行结果
・去掉重复的值
- #去掉重复的值
- df1 = df1.drop_duplicates()
-
・更改数据格式
- #更改数据格式
- df2['Chinese'].astype('str')
- df2['Chinese'].astype(np.int64)
-
・去掉数据间的空格
- #删除数据左右两边的空格
- df2['Chinese'] = df2['Chinese'].map(str.split)
-
・全部大写
- #全部大写转换
- df2.columns = df2.columns.str.upper()
-
・全部小写
- #全部小写转换
- df2.columns = df2.columns.str.lower()
-
・首字母大写
- #首字母大写
- df2.columns = df2.columns.str.title()
-
・使用apply对数据进行清洗
apply是Pandas中自由度非常高的函数,使用频率非常高。
比如:
①对Math列的数值进行大小写转换
- #对Math列进行大小写转换
- df2['Math'] = df2['Math'].apply(str.upper)
-
②定义函数,在apply中使用
- #定义函数,在apply中使用
- def par_df(par):
- return par*2
-
- df1['Chinese'] = df1['Chinese'].apply(par_df)
-
・count() 统计个数,空值NaN不计算
・describe() 一次性输出多个统计指标,包括:count, mean, std, min, max等
・min()最小值
・max()最大值
・sum()总和
・median()中位数
・var()方差
・std()标准差
・argmin() 统计最小值的索引位置
・argmax()统计最大值的索引位置
・idxmin() 统计最小值的索引值
・idxmax() 统计最大值的索引值
・inner内连接
- #内连接
- df3 = pd.merge(df1, df2, how='inner')
-
・outer外连接
- #外连接
- df3 = pd.merge(df1, df2, how='outer')
-
・right右连接
- #内连接
- df3 = pd.merge(df1, df2, how='right')
-
・left左连接
- #内连接
- df3 = pd.merge(df1, df2, how='left')
-
•loc函数:通过行索引 “Index” 中的具体值来取行数据(如取"Index"为"A"的行)
• iloc函数:通过行号来取行数据(如取第二行的数据)
老规矩,上代码
提取行的实例:
- # -*- coding: utf-8 -*-
-
- """
- @ auth : carl_DJ
- @ time : 2020-8-28
- """
- from pandas import DataFrame
- data = {
- 'Chinese':[66,88,93,11,66],
- 'Math':[30,20,40,50,77],
- 'English':[65,88,90,55,22]
- }
- df2 = DataFrame(
- data,
- index=['张三','李四','王五','赵刘','贾七'],
- columns=['Chinese','Math','English']
- )
-
- #提取index为'张三'的行
- print(f"loc函数提取index为'张三'的行的内容:\n {df2.loc[u'张三']}")
- print("="*30)
- #提取第1行内容
- print(f"iloc函数提取第1行的内容:\n {df2.iloc[1]}")
-
运行结果
提取列的实例:
- # -*- coding: utf-8 -*-
-
- """
- @ auth : carl_DJ
- @ time : 2020-8-28
- """
- from pandas import DataFrame
- data = {
- 'Chinese':[66,88,93,11,66],
- 'Math':[30,20,40,50,77],
- 'English':[65,88,90,55,22]
- }
- df2 = DataFrame(
- data,
- index=['张三','李四','王五','赵刘','贾七'],
- columns=['Chinese','Math','English']
- )
-
- #提取列为Englis的所有内容
- #使用loc函数获取分数
- print(f"loc函数提取列为Englis的所有内容:\n {df2.loc[:,['English']]}")
-
- print("="*30)
-
- #提取第2列的所有内容
- #使用iloc函数获取分数
- print(f"iloc函数提取第2列的所有内容:\n {df2.iloc[:,2]}")
-
-
运行结果
提取列和行的多条数据:
- # -*- coding: utf-8 -*-
-
- """
- @ auth : carl_DJ
- @ time : 2020-8-28
- """
-
- from pandas import DataFrame
- data = {
- 'Chinese':[66,88,93,11,66],
- 'Math':[30,20,40,50,77],
- 'English':[65,88,90,55,22]
- }
- df2 = DataFrame(
- data,
- index=['zhangsan','lisi','wangwu','zhaoliu','jiaqi'],
- columns=['Chinese','Math','English']
- )
- #使用loc函数获取分数
- loc_soc = df2.loc[['zhangsan','zhaoliu'],['Chinese','English']]
- print(f'zhangsan,zhaoliu的Chinese,English成绩分别是:\n{loc_sco}')
-
- #使用iloc函数获取分数
- iloc_sco = df2.iloc[[0,3],[0,2]]
- print(f'zhangsan,zhaoliu的Chinese,English成绩分别是:\n{iloc_sco}')
-
-
运行结果
・group by用法
- import numpy as np
- import pandas as pd
-
- #读取数据csv文件,采用gbk编码格式
- data = pd.read_csv('data_info.csv',encoding='gbk')
- result = data.groupby('sex').age([np.sum,np.mean])
- #打印结果
- print(f'结果内容显示为:\n{result}')
-
-
・排序函数sort_values()
- #对A11列从大到小进行排序
- df.sort_values('A11', ascending=False)
-
・索引还原reset_index()
- '''
- reset_index():可以还原索引,重新变为默认的整型索引
- inplace = True:不创建新的对象,直接对原始对象进行修改
- '''
- df.reset_index(inplace=True)
-
注:
这里的 sort_values 方法类似于 SQL中的order by 用法。
・读取csv文件
- #读取csv文件
- pd.read_csv('file_name')
-
・写入csv文件
- #写入csv文件,不保存index
- pd.to_csv('file_name',index=False)
-
・使用merge通过index来合并Dataframe
- #合并两个Dataframe
- df2 = df.merge(df2,left_index=True,right_index=True,how='left')
-
Pandas实战代码:
《Python3,pandas自动处理exlce数据及yagmail邮件自动发送》
Pandas参考资料: