Pandas的使用
在数据分析工作中,Pandas 的使用频率是很高的,一方面是因为 Pandas 提供的基础数据结构 DataFrame 与 json 的契合度很高,转换起来很方便。另一方面,如果日常的数据清理工作不是很复杂的话,通常用几句 Pandas 代码就可以对数据进行规整。
基本数据结构
Series 和 DataFrame是pandas的两个核心数据结构,分别代表着一维的序列和二维的表结构。基于这两种数据结构,Pandas 可以对数据进行导入、清洗、处理、统计和输出。
Series 是个定长的字典序列,有两个基本属性:index 和 values
在 Series 结构中,index 默认是 0,1,2,……递增的整数序列,也可以自定义索引,比如 index=['a','b','c']。同时可以采用字典的方式来创建 Series。
from pandas import Series
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(x1)
print(x2)
print(x3)
运行
0 1
1 2
2 3
3 4
dtype: int64
a 1
b 2
c 3
d 4
dtype: int64
a 1
b 2
c 3
d 4
dtype: int64
DataFrame 类型数据结构类似数据库表,它包括了行索引和列索引,可以将 DataFrame 看成是由相同索引的 Series 组成的字典类型。
虚构一个考试场景,A、B、C、D、E五人有各自的语数外成绩
from pandas import DataFrame
data = {'Chinese': [66, 95, 93, 90, 80], 'English': [65, 85, 92, 88, 90], 'Math': [30, 98, 96, 77, 90]}
df1 = DataFrame(data)
df2 = DataFrame(data, index=['A', 'B', 'C', 'D', 'E'], columns=['English', 'Math', 'Chinese'])
print(df1)
print(df2)
运行
Chinese English Math
0 66 65 30
1 95 85 98
2 93 92 96
3 90 88 77
4 80 90 90
English Math Chinese
A 65 30 66
B 85 98 95
C 92 96 93
D 88 77 90
E 90 90 80
上述代码中,df2 的列索引是[''English', 'Math', 'Chinese'],行索引是['A', 'B', 'C', 'D', 'E']
数据导入和输出
Pandas 允许直接从 xlsx,csv 等文件中导入数据,也可以输出到 xlsx, csv 等文件
import pandas as pd
from pandas import Series, DataFrame
score = DataFrame(pd.read_excel('data.xlsx')) # 读取文件
score.to_excel('data1.xlsx') # 保存文件
print(score)
数据清洗
数据清洗是数据准备过程中必不可少的环节
初始数据
import pandas as pd
from pandas import Series, DataFrame
data = {'Chinese': [66, 95, 93, 90,80], 'English': [65, 85, 92, 88, 90], 'Math': [30, 98, 96, 77, 90]}
df = DataFrame(data, index=['A', 'B', 'C', 'D', 'E'], columns=['English', 'Math', 'Chinese'])
删除 DataFrame 中的不必要的列或行
Pandas 提供了一个方法 drop() 函数来删除列或行。比如把"Chinese"这列删掉。
import pandas as pd
from pandas import Series, DataFrame
data = {'Chinese': [66, 95, 93, 90,80], 'English': [65, 85, 92, 88, 90], 'Math': [30, 98, 96, 77, 90]}
df = DataFrame(data, index=['A', 'B', 'C', 'D', 'E'], columns=['English', 'Math', 'Chinese'])
df = df.drop(columns=['Chinese'])
print(df)
输出
English Math
A 65 30
B 85 98
C 92 96
D 88 77
E 90 90
将"A"删掉
import pandas as pd
from pandas import Series, DataFrame
data = {'Chinese': [66, 95, 93, 90,80], 'English': [65, 85, 92, 88, 90], 'Math': [30, 98, 96, 77, 90]}
df = DataFrame(data, index=['A', 'B', 'C', 'D', 'E'], columns=['English', 'Math', 'Chinese'])
df = df.drop(index=['A'])
print(df)
输出
English Math Chinese
B 85 98 95
C 92 96 93
D 88 77 90
E 90 90 80
重命名列名
如果想对 DataFrame 中的 columns 进行重命名,可以直接使用 rename(columns=new_names, inplace=True) 函数,比如把列名 Chinese 改成 YuWen,English 改成 YingYu。
import pandas as pd
from pandas import Series, DataFrame
data = {'Chinese': [66, 95, 93, 90, 80], 'English': [65, 85, 92, 88, 90], 'Math': [30, 98, 96, 77, 90]}
df = DataFrame(data, index=['A', 'B', 'C', 'D', 'E'], columns=['English', 'Math', 'Chinese'])
df.rename(columns={'Chinese': 'YuWen', 'English': 'Yingyu'}, inplace=True)
print(df)
输出
Yingyu Math YuWen
A 65 30 66
B 85 98 95
C 92 96 93
D 88 77 90
E 90 90 80
去除重复行
df = df.drop_duplicates() #去除重复行
更改数据格式
很多时候数据格式不规范,可以使用 astype 函数来规范数据格式,比如把 Chinese 字段的值改成 str 类型,或者 int64 :
df['Chinese'].astype('str') # 改为str
df['Chinese'].astype(numpy.int64) # 改为int64
删除字符
如果数据里有某个特殊的符号要删除,可以使用 strip 函数,比如 Chinese 字段里有美元符号:
df['Chinese']=df['Chinese'].str.strip('$')
大小写转换
大小写是个比较常见的操作,比如人名、城市名等的统一都可能用到大小写的转换,在 Python 里直接使用 upper(), lower(), title() 函数,方法如下:
#全部大写
df.columns = df.columns.str.upper()
#全部小写
df.columns = df.columns.str.lower()
#首字母大写
df.columns = df.columns.str.title()
查找空值
数据量大的情况下,有些字段存在空值 NaN 的可能,这时就使用 Pandas 中的 isnull 函数进行查找。如果想看哪个地方存在空值 NaN,可以针对数据表 df 进行 df.isnull(),如果想知道哪列存在空值,可以使用 df.isnull().any()
使用 apply 进行数据清洗
apply 函数是 Pandas 中自由度非常高的函数,使用频率也非常高。
比如想对 name 列的数值都进行大写转化可以用:
df['name'] = df['name'].apply(str.upper)
也可以自定义函数,在 apply 中进行使用。比如定义 double_df 函数是将原来的数值 *2 进行返回。然后对 df1 中的“语文”列的数值进行 *2 处理,可以写成:
import pandas as pd
from pandas import Series, DataFrame
data = {'Chinese': [66, 95, 93, 90, 80], 'English': [65, 85, 92, 88, 90], 'Math': [30, 98, 96, 77, 90]}
df = DataFrame(data, index=['A', 'B', 'C', 'D', 'E'], columns=['English', 'Math', 'Chinese'])
def double_df(x): # 定义函数
return 2 * x
df["Chinese"] = df["Chinese"].apply(double_df)
print(df)
也可以定义更复杂的函数,比如对于 DataFrame,可以新增两列,其中’new1’列是“语文”和“英语”成绩之和的 m 倍,'new2’列是“语文”和“英语”成绩之和的 n 倍,可以这样写:
import pandas as pd
from pandas import Series, DataFrame
data = {'Chinese': [66, 95, 93, 90, 80], 'English': [65, 85, 92, 88, 90], 'Math': [30, 98, 96, 77, 90]}
df = DataFrame(data, index=['A', 'B', 'C', 'D', 'E'], columns=['English', 'Math', 'Chinese'])
def plus(df, n, m):
df['new1'] = (df["Chinese"]+df["English"]) * m
df['new2'] = (df["Chinese"]+df["English"]) * n
return df
df = df.apply(plus, axis=1, args=(2, 3,))
print(df)
输出
English Math Chinese new1 new2
A 65 30 66 393 262
B 85 98 95 540 360
C 92 96 93 555 370
D 88 77 90 534 356
E 90 90 80 510 340
数据统计
数据清洗后要进行数据统计
Pandas 和 NumPy 一样,都有常用的统计函数,如果遇到空值 NaN,会自动排除。
| 函数 | 作用 |
|---|---|
| count | 统计个数,空值NaN不计算 |
| describe | 一次性输出多个统计指标,包括:count,mean,std,min,max等 |
| min | 最小值 |
| max | 最大值 |
| sum | 总和 |
| mean | 平均值 |
| median | 中位数 |
| var | 方差 |
| std | 标准差 |
| argmin | 统计最小值的索引位置 |
| argmax | 统计最大值的索引位置 |
| idxmin | 统计最小值的索引位置 |
| idxmax | 统计最大值的索引位置 |
describe可以给出一个整体的统计
df = DataFrame({'name': ['A', 'B', 'C', 'D', 'E'], 'data': range(5)})
print(df.describe())
运行
data
count 5.000000
mean 2.000000
std 1.581139
min 0.000000
25% 1.000000
50% 2.000000
75% 3.000000
max 4.000000
数据表合并
一个 DataFrame 相当于一个数据库的数据表,那么多个 DataFrame 数据表的合并就相当于多个数据库的表合并。
两个 DataFrame 数据表的合并使用的是 merge() 函数,有下面 5 种形式:
基于指定列进行连接
基于 name 这列进行连接
import pandas as pd
from pandas import Series, DataFrame
df1 = DataFrame({'name': ['A', 'B', 'C', 'D', 'E'], 'data1': range(5)})
df2 = DataFrame({'name': ['A', 'B', 'C', 'D', 'F'], 'data2': range(5)})
df3 = pd.merge(df1, df2, on='name')
print(df3)
输出
name data1 data2
0 A 0 0
1 B 1 1
2 C 2 2
3 D 3 3
inner 内连接
nner 内链接是 merge 合并的默认情况,inner 内连接其实也就是键的交集,在这里 df1, df2 相同的键是 name,所以是基于 name 字段做的连接:
df1 = DataFrame({'name': ['A', 'B', 'C', 'D', 'E'], 'data1': range(5)})
df2 = DataFrame({'name': ['A', 'B', 'C', 'D', 'F'], 'data2': range(5)})
df3 = pd.merge(df1, df2, how='inner')
print(df3)
输出
name data1 data2
0 A 0 0
1 B 1 1
2 C 2 2
3 D 3 3
left 左连接
左连接是以第一个 DataFrame 为主进行的连接,第二个 DataFrame 作为补充。
df3 = pd.merge(df1, df2, how='left')
print(df3)
输出
name data1 data2
0 A 0 0.0
1 B 1 1.0
2 C 2 2.0
3 D 3 3.0
4 E 4 NaN
right 右连接
右连接是以第二个 DataFrame 为主进行的连接,第一个 DataFrame 作为补充。
df3 = pd.merge(df1, df2, how='right')
print(df3)
输出
name data1 data2
0 A 0.0 0
1 B 1.0 1
2 C 2.0 2
3 D 3.0 3
4 F NaN 4
outer 外连接
外连接相当于求两个 DataFrame 的并集。
df3 = pd.merge(df1, df2, how='outer')
print(df3)
输出
name data1 data2
0 A 0.0 0.0
1 B 1.0 1.0
2 C 2.0 2.0
3 D 3.0 3.0
4 E 4.0 NaN
5 F NaN 4.0
用 SQL 方式打开 Pandas
在 Python 里可以直接使用 SQL 语句来操作 Pandas
pandasql 中的主要函数是 sqldf,它接收两个参数:一个 SQL 查询语句,还有一组环境变量 globals() 或 locals()。
示例
from pandas import DataFrame
from pandasql import sqldf, load_meat, load_births
df1 = DataFrame({'name': ['A', 'B', 'C', 'D', 'E'], 'data1': range(5)})
pysqldf = lambda sql: sqldf(sql, globals())
sql = "select * from df1 where name ='A'"
print(pysqldf(sql))
输出
name data1
0 A 0
Pandas的使用的更多相关文章
- pandas基础-Python3
未完 for examples: example 1: # Code based on Python 3.x # _*_ coding: utf-8 _*_ # __Author: "LEM ...
- 10 Minutes to pandas
摘要 一.创建对象 二.查看数据 三.选择和设置 四.缺失值处理 五.相关操作 六.聚合 七.重排(Reshaping) 八.时间序列 九.Categorical类型 十.画图 十一 ...
- 利用Python进行数据分析(15) pandas基础: 字符串操作
字符串对象方法 split()方法拆分字符串: strip()方法去掉空白符和换行符: split()结合strip()使用: "+"符号可以将多个字符串连接起来: join( ...
- 利用Python进行数据分析(10) pandas基础: 处理缺失数据
数据不完整在数据分析的过程中很常见. pandas使用浮点值NaN表示浮点和非浮点数组里的缺失数据. pandas使用isnull()和notnull()函数来判断缺失情况. 对于缺失数据一般处理 ...
- 利用Python进行数据分析(12) pandas基础: 数据合并
pandas 提供了三种主要方法可以对数据进行合并: pandas.merge()方法:数据库风格的合并: pandas.concat()方法:轴向连接,即沿着一条轴将多个对象堆叠到一起: 实例方法c ...
- 利用Python进行数据分析(9) pandas基础: 汇总统计和计算
pandas 对象拥有一些常用的数学和统计方法. 例如,sum() 方法,进行列小计: sum() 方法传入 axis=1 指定为横向汇总,即行小计: idxmax() 获取最大值对应的索 ...
- 利用Python进行数据分析(8) pandas基础: Series和DataFrame的基本操作
一.reindex() 方法:重新索引 针对 Series 重新索引指的是根据index参数重新进行排序. 如果传入的索引值在数据里不存在,则不会报错,而是添加缺失值的新行. 不想用缺失值,可以用 ...
- 利用Python进行数据分析(7) pandas基础: Series和DataFrame的简单介绍
一.pandas 是什么 pandas 是基于 NumPy 的一个 Python 数据分析包,主要目的是为了数据分析.它提供了大量高级的数据结构和对数据处理的方法. pandas 有两个主要的数据结构 ...
- pandas.DataFrame对行和列求和及添加新行和列
导入模块: from pandas import DataFrame import pandas as pd import numpy as np 生成DataFrame数据 df = DataFra ...
- pandas.DataFrame排除特定行
使用Python进行数据分析时,经常要使用到的一个数据结构就是pandas的DataFrame 如果我们想要像Excel的筛选那样,只要其中的一行或某几行,可以使用isin()方法,将需要的行的值以列 ...
随机推荐
- js 信息脱敏
前端展示信息时,往往要对身份证号.手机号.地址等这类敏感信息进行部分隐藏显示,就是要脱敏处理 一个简单粗暴的脱敏处理方法记录下: hideSensitiveData (string, saveLeng ...
- FCC 高级算法题 收银机找零钱
Exact Change 设计一个收银程序 checkCashRegister() ,其把购买价格(price)作为第一个参数 , 付款金额 (cash)作为第二个参数, 和收银机中零钱 (cid) ...
- 一起学JAVA:做一个简单的API项目吧(一)
由于一些特殊原因,最近想要去学习JAVA,了解JAVA ,然后在此之前对JAVA只停留在能读懂代码,但是写不懂的状态,那么最近又很闲,所以打算重新进行一波自己的学习计划,又因为是三分钟的热情,所以特意 ...
- 代码片断:GDI绘制带一定角度的椭圆
//先将DXF文件中的Ellipse 解析到elpList 中 foreach (Ellipse ellipse in elpList) { //定义一个矩形 RectangleF rect = ne ...
- 从XXE漏洞修复引起Not supported: http://javax.xml.XMLConstants/property/accessExternalDTD说到SPI机制
引子 在使用Fortify扫描时代码报XML External Entity Injection,此漏洞为xml实体注入漏洞,XXE攻击可利用在处理时动态构建文档的 XML 功能.修复方案也包含了增 ...
- Apache Ranger系列六:Submarine Spark Security Plugin安装(0.6.0版本)
参考 https://submarine.apache.org/zh-cn/docs/0.6.0/userDocs/submarine-security/spark-security/ 从ranger ...
- Oracle入门- 数据库操作相关脚本
1. 创建表 1 CREATE TABLE SYS_NOTICE 2 ( 3 GUID CHAR(32) NOT NULL, 4 TITLE VARCHAR2(128) NOT NULL 5 ); 6 ...
- mybatis_19
id username birthday sex address 1 王五 2 10 张三 2014-07-10 1 北京市 16 张小明 1 河南郑州 22 陈小明 1 河南郑州 24 张三丰 1 ...
- vue 纵向滑动模块
代码 <template> <div> <!-- 左侧的滑动模块 --> <div class="scroll-box" :style=& ...
- Windows系统镜像下载站合集
Windows系统镜像下载站合集https://latest10.win/https://msdn.itellyou.cn/https://hellowindows.cn/https://www.im ...