参考链接
- https://zhuanlan.zhihu.com/p/85967505
为什么使用Pandas
- Pandas提供的基础数据结构DataFrame与json的契合度很高;
- 语言简洁、功能强大。
Series和DataFrame是Pandas的两个核心数据结构,分别代表一维的序列和二维的表结构。
Series
Series是个定长的字典序列,因为在存储的时候,相当于两个ndarray。
Series有两个基本属性:index和values。
index默认是递增的整数序列:0,1,2,…。也可以自定义索引,如index=[‘a’,‘b’, …]。
import pandas as pd
from pandas import Series
x1 = Series([1, 2, 3, 4])
x2 = Series([1, 2, 3, 4], index=['a', 'b', 'c', 'd'])
print(x1)
print(x2)
也可以采用字典的方式创建Series。
d = {'a':1, 'b':2, 'c':3, 'd':4}
x3 = Series(d)
print(x3)
DataFrame
DataFrame类似于数据库表,包含了行索引和列索引。下面是一个成绩统计的例子。
data = {'Chinese': [60, 70, 80, 90, 100], 'English': [65, 75, 85, 95, 100], 'Math': [50, 60, 70, 80, 90]}
df1 = DataFrame(data)
df2 = DataFrame(data, index=['张三', '李四', '王五', '赵六', '朱七'])
print(df1)
print(df2)
数据导入和输出
从xlsx、csv等文件中导入数据
score = DataFrame(pd.read_excel('data.xlsx'))
输出到xlsx、csv等文件
score.to_excel('data1.xlsx')
数据清洗
以上面构建的数据为例。
删除DataFrame中不必要的行或列
使用drop(),如:
- 删除“Chinese”这一列
df2 = df2.drop(columns=['Chinese'])
- 删除“李四”这一行
df2 = df2.drop(index=['李四'])
重命名列名columns
使用rename(columns=new_names, inplace=True)函数,如将列名全换成中文
df2.rename(columns={'Chinese': '语文', 'English': '英语', 'Math': '数学'}, inplace=True)
去重复的行
df = df.drop_duplicates()
更改数据格式
使用astype函数来规范数据格式,比如“Chinese”字段的值改成str类型或int64类型:
df2['Chinese'] = df2['Chinese'].astype('str')
df2['Chinese'] = df2['Chinese'].astype(np.int64)
删除数据中的空格
使用strip()函数
- 删除左右两边空格
df2['Chinese'] = df2['Chinese'].str.strip()
- 删除左边的空格
df2['Chinese'] = df2['Chinese'].str.lstrip()
- 删除右边的空格
df2['Chinese'] = df2['Chinese'].str.rstrip()
- 删除某个符号
df2['Chinese'] = df2['Chinese'].str.strip('$')
大小写转换
- 全部大写
df2.columns = df2.columns.str.upper()
- 全部小写
df2.columns = df2.columns.str.lower()
- 首字母大写
df2.columns = df2.columns.str.title()
查找空值
有些字段存在空值NaN,需要使用isnull()函数进行查找
- 查看哪些地方存在空值,可以针对数据表使用isnull()
df.isnull()
- 查看哪列存在空值
df.isnull().any()
- 查看哪行存在空值
df.isnull().T.any()
使用apply函数
- 对列数值都进行大写转化
df2['Chinese'] = df2['Chinese'].apply(str.upper)
- 自定义apply函数,实现将数值*2后返回
def double_df(x):
return 2*x
df2['Chinese'] = df2['Chinese'].apply(double_df)
- 自定义apply函数,实现新增两列数据
def plus(df, n, m):
df['new1'] = (df['Chinese'] + df['Math']) * m
df['new2'] = (df['Chinese'] + df['Math']) * n
return df
df2 = df2.apply(plus, axis=1, args=(2, 3,))
数据统计
- 统计个数,空值NaN不计算:count()
- 一次性输出多个统计指标,包括:count,mean,std,min,max等 推荐
df2.describe()
- 最小值:min()
- 最大值:max()
- 总和:sum()
- 平均值:mean()
- 中位数:median()
- 方差:var()
df2.var()
- 标准差:std()
df2.std()
- 统计最小值的索引位置:argmin()
df2['Chinese'].argmin()
- 统计最大值的索引位置:argmax()
df2['Chinese'].argmax()
- 统计最小值的索引值:idxmin()
df2['Chinese'].idxmin()
- 统计最大值的索引值:idxmax()
df2['Chinese'].idxmax()
数据表合并
多个DataFrame数据表的合并相当于多个数据库的表合并
- 基于指定列
df3 = pd.merge(df1, df2, on='name')
- inner内连接
inner内连接是merge合并的默认情况,就是找键的交集。
df3 = pd.merge(df1, df2, how='inner')
- left左连接
左连接以第一个DataFrame为主进行连接,第二个DataFrame作为补充
df3 = pd.merge(df1, df2, how='left')
- right右连接
右连接以第二个DataFrame为主进行连接,第一个DataFrame作为补充
df3 = pd.merge(df1, df2, how='right')
- outer外连接
外连接相当于求两个DataFrame的并集
df3 = pd.merge(df1, df2, how='outer')
用SQL操作Pandas
通过pandasql,可以在Python里使用SQL语句来操作Pandas。
pandasql中的主要函数是sqldf,它接收两个参数:一个是SQL查询语句,还有一组环境变量globals()或locals()。这样就可以用SQL语句对DataFrame进行操作。
pysqldf = lambda sql: sqldf(sql, globals())
sql = "select * from df2 where Chinese = 100 "
print(pysqldf(sql))
因为在sql中有对全局参数df2的使用,所以sqldf中也输入了globals()全局参数。
一行代码生成数据分析报告
使用pandas_profiling包就可以实现这一功能。
pandas_profiling会提供以下统计信息:
1、概要:数据类型,唯一值,缺失值,内存大小
2、分位数统计:最小值、最大值、中位数、Q1、Q3、最大值,值域,四分位
3、描述性统计:均值、众数、标准差、绝对中位差、变异系数、峰值、偏度系数
4、最频繁出现的值,直方图/柱状图
5、相关性分析可视化:突出强相关的变量,Spearman, Pearson矩阵相关性色阶图
并且这个报告可以导出为HTML。
安装pandas_profiling
pip install pandas_profiling
生成数据分析报告
report = pandas_profiling.ProfileReport(data)
report.to_file('report.html')
其中data为DataFrame格式的数据。