数据分析(5)--Pandas数据处理(csv,sql等)

数据处理

数据加载

首先,我们需要将收集的数据加载到内存中,才能进行进一步的操作。pandas提供了非常多的读取数据的函数,分别应用在各种数据源环境中,我们常用的函数为:

  • read_csv
  • read_table
  • read_sql

说明:

  • read_csv与read_table默认使用的分隔符不同。

常用参数

read_csv与read_table常用的参数:

  • sep / delimiter
  • header
  • names
  • index_col
  • usecols

导入头文件

import numpy as np
import pandas as pd
读取csv文件*
# 读取参数指定路径的文件(数据集),返回读取后的结果。(DataFrame类型)
# header 用来指定标题行,如果数据集中没有标题行,则指定为None。
# sep指定数据之间的分隔符,默认为逗号(,)。
# df = pd.read_csv("spider.csv", header=None)
# 在读取数据的时候,可以通过names属性设置列索引。
# df = pd.read_csv("spider.csv", header=None, names=["日期", "链接", "内容", "票房", "票房2"])
# 可以将数据集中的某一列(某几列)设置为行索引。通过index_col来进行指定。
# df = pd.read_csv("spider.csv", header=None, names=["日期", "链接", "内容", "票房", "票房2"], index_col="日期")
# 通过通过usecols参数来设置需要使用的列。
df = pd.read_csv("spider.csv", header=None, names=["日期", "链接", "内容", "票房", "票房2"], usecols=["日期", "链接"])
df.head()
读取并执行sql
# read_table与read_csv功能一样,只是read_table默认的分隔符为\t (制表符),而
# read_csv默认的分隔符为逗号(,)
df = pd.read_table("spider.csv", sep=",", header=None)
df

# read_sql从数据库中读取数据集。
import sqlite3
连接数据库
con = sqlite3.connect("test.db")
建表
con.execute("create table person(id int primary key, name varchar)")
插入表
# con.execute("insert into person(id, name) values (3, '3dsfdsa')")
con.execute("insert into person(id, name) values (4, null)")
con.commit()
查询数据
df = pd.read_sql("select id, name from person", con)
数据持久化

写入文件

DataFrame与Series对象的to_csv方法,可以将数据写入文件或者指定的数据流中。

  • to_csv

常用参数

  • sep
  • header 是否写入标题行
  • na_rep 空值的表示
  • index 是否写入索引
  • index_label 索引字段的名称
  • columns 写入的字段
# 向文件中写入数据。
# df.to_csv("c:/test.csv")
# 通过sep参数指定分隔符。
# df.to_csv("c:/test.csv", sep="。")
# header,用来设置是否写入标题行,默认为True。
# df.to_csv("c:/test.csv", header=False)
# 参数na_rep来设置空值的显示方式,默认空值不显示。
# df.to_csv("c:/test.csv", header=False, na_rep="空值")
# index 设置是否写入索引。默认为True。
# df.to_csv("c:/test.csv", header=False, index=False)
# index_label用来设置索引字段的名称,默认为""(空字符串)
# df.to_csv("c:/test.csv", index_label="索引字段名称")
# columns参数控制需要写入哪些列。
# df.to_csv("c:/test.csv", columns=["name"])

# 将DataFrame数据写入文件(类文件)对象中。
from io import StringIO
s = StringIO()
df.to_csv(s)
# 将指针移动到文件的靠头。因为我们之前刚刚写入过内容,如果不移动到开头,
# 将无法使用read读取。
s.seek(0)
s.read()
# s.getvalue()

数据清洗

我们需要对数据进行一些预处理操作,才能用到后续的数据分析与机器学习中。这是因为,无论数据的来源为何处,我们都不可能保证数据一定是准确无误的。
数据清洗可以包含以下几方面内容:

  • 处理缺失值
  • 处理异常值
  • 处理重复值

缺失值处理

发现缺失值

Pandas中,会将float类型的nan与None视为缺失值,我们可以通过如下方法来检测缺失值:

  • info
  • isnull
  • notnull

说明:

  • 判断是否存在空值,可以将isnull与any或all结合使用。

丢弃缺失值

对于缺失值,我们可以将其进行丢弃处理(dropna)。

说明:

  • how:指定dropna丢弃缺失值的行为,默认为any。
  • axis:指定丢弃行或者丢弃列(默认为丢弃行)。
  • thresh:当非空数值达到该值时,保留数据,否则删除。
  • inplace:指定是否就地修改,默认为False。

填充缺失值

我们也可以对缺失值进行填充(fillna)。

说明:

  • value:填充所使用的值。可以是一个字典,这样就可以为DataFrame的不同列指定不同的填充值。
  • method:指定前值(上一个有效值)填充(pad / ffill),还是后值(下一个有效值)填充(backfill / bfill)。
  • limit:如果指定method,表示最大连续NaN的填充数量,如果没有指定method,则表示最大的NaN填充数量。
  • inplace:指定是否就地修改,默认为False。

无效值处理

检测无效值

可以通过DataFrame对象的describe方法查看数据的统计信息。不同类型的列,统计信息也不太相同。

重复值处理

在处理数据中,可能会出现重复的数据,我们通常需要将重复的记录删除。

发现重复值

我们可以通过duplicated方法来发现重复值。该方法返回Series类型的对象,值为布尔类型,表示是否与上一行重复。

参数说明:

  • subset:指定依据哪些列判断是否重复,默认为所有列。
  • keep:指定记录被标记为重复(True)的规则。默认为first。

删除重复值

通过drop_duplicates可以删除重复值。

参数说明:

  • subset:指定依据哪些列判断是否重复,默认为所有列。
  • keep:指定记录删除(或保留)的规则。默认为First。
  • inplace:指定是否就地修改,默认为False。

数据过滤

可以使用布尔数组或者索引数组的方式来过滤数据。
另外,也可以用DataFrame类的query方法来进行数据过滤。在query方法中也可以使用外面定义的变量,需要在变量前加上@。

数据转换

应用与映射

Series与DataFrame对象可以进行行(列)或元素级别的映射转换操作。对于Series,可以调用apply或map方法。对于DataFrame,可以调用apply或applymap方法。

  • apply:通过函数实现映射转换。【Series传递元素,DataFrame传递行或列。】
  • map:对当前Series的值进行映射转换。参数可以是一个Series,一个字典或者是一个函数。
  • applymap:通过函数实现元素级的映射转换。

替换

Series或DataFrame可以通过replace方法可以实现元素值的替换操作。

  • to_replace:被替换值,支持单一值,列表,字典,正则表达式。
  • regex:是否使用正则表达式,默认为False。

数据合并

concat

我们可以通过DataFrame或Series类型的concat方法,来进行连接操作,连接时,会根据索引进行对齐。

  • axis:指定连接轴,默认为0。
  • join:指定连接方式,默认为外连接。【outer:并集,inner:交集】
  • keys:可以用来区分不同的数据组。
  • join_axes:指定连接结果集中保留的索引。
  • ignore_index:忽略原来连接的索引,创建新的整数序列索引,默认为False。

append

在对行进行连接时,也可以使用Series或DataFrame的append方法。

# DataFrame的合并,是根据索引对齐的。纵向合并根据列索引对齐,横向合并会根据行索引对齐。

h = df.head()
t = df.tail()
t.columns = ["date", "link", "info", "v1", "v2"]
# display(h, t)

# t.cloumns[0] = "date"
# 纵向合并
# pd.concat([h, t], axis=0)
# 横向合并
# t.index = [0, 1, 2, 3, 4]
# pd.concat([h, t], axis=1)

# 可以通过join来指定对齐方式。outer(默认)为并集,inner为交集。
# pd.concat([h, t], axis=0, join="outer")
# pd.concat([h, t], axis=0, join="inner")
# pd.concat([h, t], axis=0, keys=["head", "tail"])

# join_axes 指定结果集中保留的索引。
# pd.concat([h, t], axis=0, join_axes=[h.columns])
# pd.concat([h, t], axis=0, join_axes=[t.columns])

# 忽略以前的索引,对索引进行重排。
pd.concat([h, t], ignore_index=True)

merge

通过pandas或DataFrame的merge方法,可以进行两个DataFrame的连接,这种连接类似于SQL中对两张表进行的join连接。

  • how:指定连接方式。可以是inner, outer, left, right,默认为inner。
  • on 指定连接使用的列(该列必须同时出现在两个DataFrame中),默认使用两个DataFrame中的所有同名列进行连接。
  • left_on / right_on:指定左右DataFrame中连接所使用的列。
  • left_index / right_index:是否将左边(右边)DataFrame中的索引作为连接列,默认为False。
  • suffixes:当两个DataFrame列名相同时,指定每个列名的后缀(用来区分),默认为_x与_y。
df1 = pd.DataFrame([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
df2 = pd.DataFrame([[4, 2, 3], [10, 8, 9], [7, 8, 10]], columns=[4, 1, 2])
display(df1, df2)
# 没有指定连接条件,则使用所用同名字段进行等值连接(相当于是数据库中的自然连接natural join。)
# df1.merge(df2)
# 我们可以通过how指定连接方式。默认是inner。
# inner:内连接   outer:全外连接   left:左外连接    right:右外连接
# df1.merge(df2, how="outer")
# df1.merge(df2, how="left")
# df1.merge(df2, how="right")

# 我们可以通过on来指定连接字段(列),该列必须同时出现在两个DataFrame中。如果没有指定on,
# 则使用两个DataFrame中的所有同名字段进行等值连接。
# df1.merge(df2, on=1)
# 我们可以使用left_on与right_on分别指定左表与右表用于连接的列名。
# df1.merge(df2, left_on=0, right_on=4)

# 可以指定left_index与right_index来设置是否使用索引列进行连接。
# df1.merge(df2, left_index=True, right_index=True)
# 也可以指定一张表使用索引,一张表使用列来进行连接。
# df1.merge(df2, left_index=True, right_on=1)
# left_on与left_index(True)或者right_on与right_index(True)不能可以共存
# 错误。
# df1.merge(left_on=0, left_index=True, right_index=True)

# 可以通过suffixes参数来指定,当列名重名时,每个表列名的后缀,默认是_x与_y。
df1.merge(df2, left_on=0, right_on=4, suffixes=["_A", "_B"])

join

与merge方法类似,但是默认使用索引进行连接。

  • how:指定连接方式。可以是inner, outer, left, right,默认为left。
  • on:设置当前DataFrame对象使用哪个列与参数对象的索引进行连接。
  • lsuffix / rsuffix:当两个DataFrame列名相同时,指定每个列名的后缀(用来区分),如果不指定,列名相同会产生错误。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值