首先,我们需要将收集的数据加载到内存中,才能进行进一步的操作。pandas提供了非常多的读取数据的函数,分别应用在各种数据源环境中,我们常用的函数为:
说明:
read_csv与read_table常用的参数:
import numpy as np
import pandas as pd
# 读取参数指定路径的文件(数据集),返回读取后的结果。(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()
# 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方法,可以将数据写入文件或者指定的数据流中。
# 向文件中写入数据。
# 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视为缺失值,我们可以通过如下方法来检测缺失值:
说明:
对于缺失值,我们可以将其进行丢弃处理(dropna)。
说明:
我们也可以对缺失值进行填充(fillna)。
说明:
可以通过DataFrame对象的describe方法查看数据的统计信息。不同类型的列,统计信息也不太相同。
在处理数据中,可能会出现重复的数据,我们通常需要将重复的记录删除。
我们可以通过duplicated方法来发现重复值。该方法返回Series类型的对象,值为布尔类型,表示是否与上一行重复。
参数说明:
通过drop_duplicates可以删除重复值。
参数说明:
可以使用布尔数组或者索引数组的方式来过滤数据。
另外,也可以用DataFrame类的query方法来进行数据过滤。在query方法中也可以使用外面定义的变量,需要在变量前加上@。
Series与DataFrame对象可以进行行(列)或元素级别的映射转换操作。对于Series,可以调用apply或map方法。对于DataFrame,可以调用apply或applymap方法。
Series或DataFrame可以通过replace方法可以实现元素值的替换操作。
我们可以通过DataFrame或Series类型的concat方法,来进行连接操作,连接时,会根据索引进行对齐。
在对行进行连接时,也可以使用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)
通过pandas或DataFrame的merge方法,可以进行两个DataFrame的连接,这种连接类似于SQL中对两张表进行的join连接。
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"])
与merge方法类似,但是默认使用索引进行连接。