数据分析入门——Pandas的常用操作

参考链接

  1. https://zhuanlan.zhihu.com/p/85967505

为什么使用Pandas

  1. Pandas提供的基础数据结构DataFrame与json的契合度很高;
  2. 语言简洁、功能强大。

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(),如:

  1. 删除“Chinese”这一列
df2 = df2.drop(columns=['Chinese'])
  1. 删除“李四”这一行
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()函数

  1. 删除左右两边空格
df2['Chinese'] = df2['Chinese'].str.strip()
  1. 删除左边的空格
df2['Chinese'] = df2['Chinese'].str.lstrip()
  1. 删除右边的空格
df2['Chinese'] = df2['Chinese'].str.rstrip()
  1. 删除某个符号
df2['Chinese'] = df2['Chinese'].str.strip('$')

大小写转换

  1. 全部大写
df2.columns = df2.columns.str.upper()
  1. 全部小写
df2.columns = df2.columns.str.lower()
  1. 首字母大写
df2.columns = df2.columns.str.title()

查找空值

有些字段存在空值NaN,需要使用isnull()函数进行查找

  1. 查看哪些地方存在空值,可以针对数据表使用isnull()
df.isnull()
  1. 查看哪列存在空值
df.isnull().any()
  1. 查看哪行存在空值
df.isnull().T.any()

使用apply函数

  1. 对列数值都进行大写转化
df2['Chinese'] = df2['Chinese'].apply(str.upper)
  1. 自定义apply函数,实现将数值*2后返回
def double_df(x):
    return 2*x
df2['Chinese'] = df2['Chinese'].apply(double_df)
  1. 自定义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,))

数据统计

  1. 统计个数,空值NaN不计算:count()
  2. 一次性输出多个统计指标,包括:count,mean,std,min,max等 推荐
df2.describe()
  1. 最小值:min()
  2. 最大值:max()
  3. 总和:sum()
  4. 平均值:mean()
  5. 中位数:median()
  6. 方差:var()
df2.var()
  1. 标准差:std()
df2.std()
  1. 统计最小值的索引位置:argmin()
df2['Chinese'].argmin()
  1. 统计最大值的索引位置:argmax()
df2['Chinese'].argmax()
  1. 统计最小值的索引值:idxmin()
df2['Chinese'].idxmin()
  1. 统计最大值的索引值:idxmax()
df2['Chinese'].idxmax()

数据表合并

多个DataFrame数据表的合并相当于多个数据库的表合并

  1. 基于指定列
df3 = pd.merge(df1, df2, on='name')
  1. inner内连接
    inner内连接是merge合并的默认情况,就是找键的交集。
df3 = pd.merge(df1, df2, how='inner')
  1. left左连接
    左连接以第一个DataFrame为主进行连接,第二个DataFrame作为补充
df3 = pd.merge(df1, df2, how='left')
  1. right右连接
    右连接以第二个DataFrame为主进行连接,第一个DataFrame作为补充
df3 = pd.merge(df1, df2, how='right')
  1. 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格式的数据。

上一篇:python合并表格,join与merge函数的代码加简单描述


下一篇:js——获取数组中的最大值