# 导入及查看
import numpy as np #导入numpy
import pandas as pd #导入pandas
np.__version__ #打印numpy版本号
pd.__version__ #打印pandas版本号
pd.set_option("max_columns", 10) #用于设置列中单独元素的最大长度,默认为50
df.head() #默认显示5行
df.tail() # 显示后n行
df.sample(5) # 随机采样,随机选择n行。n默认为1.
df.shape[0] #数据条数
df.shape[1] #数列列的个数
df.columns #打印出全部的列名称
chipo.index #查看列索引
# 处理
t.info() #查看空值
t[t.duplicated()] #查看重复
t.drop_duplicates(inplace=True) #删除重复
sp = t[2].str.split(";", expand=True) #对列拆分
sp.drop([8, 9], axis=1, inplace=True) #删除列
sp[7] = sp[7].str.replace("票房(万)", "").astype(np.float64) #替换列内无用信息,提取数据并做类型转换
result = pd.concat((t, sp), axis=1) #与原表按列进行拼接
result.columns = list(range(result.columns.size)) #重新指定列索引
g = result.groupby(0) #按列分组
g[10].sum().sort_values(ascending=False) #统计并排序
一、数据加载与导出
1. read_csv数据加载
常用函数:
-
read_csv
-
read_table
-
read_sql
说明:read_csv与read_table默认使用的分隔符不同。
常用参数:
-
sep / delimiter:导入文件时候指定分隔符,默认使用","
# 读取csv文件,返回一个DataFrame类型的对象。 # 在读取的时候,默认会将第一行记录当成标题。如果没有标题,我们可以指定header=None。 # read_csv默认使用逗号作为分隔符,我们可以使用sep或delimiter来指定分隔符。 df = pd.read_csv(r"student.csv", header=None, sep=",") display(df.head())
-
header:生成列标签,默认"0, 1, 2, 3, ……"
# 如果header为None,read_csv默认会自己生成列标签。(0, 1, 2, 3……)。我们可以通过names参数来指定列标签(标题) df = pd.read_csv(r"student.csv", header=None, names=["学号", "姓名", "性别", "年龄", "部门"]) display(df.head())
-
index_col:生成行标签,默认"0, 1, 2, 3, ……"
# 对于行索引,默认会自动生成(0, 1, 2, 3 ……)如果我们需要自己指定某列充当行索引(例如,数据库,数据表中的主键) # 我们可以使用index_col参数来进行设置。 df = pd.read_csv(r"student.csv", header=None, index_col=0, names=["学号", "姓名", "性别", "年龄", "部门"]) display(df.head())
-
usecols:控制载入的列数
# 我们可以使用usecols来控制需要哪些列。如果某列充当索引列(index_col),则充当索引列的标签,也需要指定在usecols中。 df = pd.read_csv(r"student.csv", header=None, index_col=0, usecols=[0, 1, 2],names=["学号", "姓名", "性别"]) display(df.head())
2. to_csv写入文件并导出
to_csv:DataFrame与Series对象的to_csv方法,可以将数据写入文件或者指定的数据流中。
常用参数:
-
sep:分隔符
# 默认以逗号作为分隔符,可以使用sep来自定义分隔符。 df.to_csv("data1.csv", sep="-")
-
header:是否写入标题行,默认为True。
# 默认情况会写入标题(行标签索引)。可以使用header进行设置是否写入标题。True,写入(默认),False不写入。 df.to_csv("data2.csv", header=False)
-
na_rep:空值的表示
# 默认情况下,空值不显示,我们可以自定义空值的显式效果(内容)。 df.to_csv("data3.csv", header=False, na_rep="空")
-
index:是否写入索引,默认为True。
# 行索引,默认写入,我们可以通过参数index来设置是否写入行索引。True,写入(默认), False,不写入。 df.to_csv("data4.csv", header=False, na_rep="空", index=False)
-
index_label:索引字段的名称
# 可以通过index_label来设置行索引的名称。 df.to_csv("data5.csv", index_label="index_name", na_rep="空")
-
columns:写入的字段,默认为全部写入。
# 我们可以通过colomns列来设置那些列写入到文件中。默认为写入所有列。 df.to_csv("data6.csv", columns=[1, 3], header=False, na_rep="空", index=False)
二、数据清洗
1. 处理缺失值
1. info()发现缺失值
Pandas中,会将float类型的nan与None视为缺失值,我们可以通过如下方法来检测缺失值:
说明:判断是否存在空值,可以将isnull与any或all结合使用。
-
info:显示DataFrame中每列的相关信息
# 检测缺失值,首先可以调用info方法进行整体查看。 df.info()
<class ‘pandas.core.frame.DataFrame’>
RangeIndex: 22 entries, 0 to 21 #22条记录,范围为0-21
Data columns (total 5 columns): #共有5列数据# Column Non-Null Count Dtype
— ------ -------------- -----
0 0 22 non-null int64
1 1 22 non-null object
2 2 22 non-null object
3 3 22 non-null int64
4 4 22 non-null object
dtypes: int64(2), object(3)
memory usage: 1008.0+ bytes
-
isnull:是否存在空值
display(df.isnull().head()) display(df[2].isnull().any()) display(df[3].isnull().any())
0 1 2 3 4 0 False False False False False 1 False False False False False 2 False False False True True 3 False False False False False 4 False False False True True False #第二列不存在空值 True #第三列存在空值
-
notnull:与isnull相反
2. dropna()丢弃缺失值
dropna:对于缺失值,我们可以将其进行丢弃处理。
常用参数:
-
how:指定dropna丢弃缺失值的行为,默认为any。
# 处理空值。丢弃空值,使用dropna。 df.dropna().info() # 默认情况下,how的值为any,表示只要存在空值,就丢弃行(列),我们可以指定为all,表示所有值为空值时,才进行删除。 df.dropna(how="all").info()
-
axis:指定丢弃行或者丢弃列(默认为丢弃行)。
# 默认,存在空值,会丢弃行,我们可以指定丢弃列。(axis=0表示按行删除,axis=1表示按列删除。) display(df.dropna(axis=1).head())
-
thresh:当非空数值达到该值时,保留数据,否则删除。
# 有时候,how的any与all可能都不太合适。any的条件太宽松,all又太严格。我们可以自定义删除的门槛。 # 通过thresh来指定(门槛)。指的是非空的数据至少要达到thresh指定的数量时,整个行(列)才会保留,否则就删除。 # 可以使用inplace来设置是否进行就地修改。默认为False。 df.dropna(thresh=3, inplace=False).head()
-
inplace:指定是否就地修改,默认为False。
# # 默认,存在空值,会丢弃行,我们可以指定丢弃列。(axis=0表示按行删除,axis=1表示按列删除。) display(df.dropna(axis=1).head())
3. fillna()填充缺失值
fillna():我们也可以对缺失值进行填充(fillna)。
常用参数:
-
value:填充所使用的值。可以是一个字典,这样就可以为DataFrame的不同列指定不同的填充值。
# 填充值 fillna进行填充。 # 使用固定值来填充所有的列。 df1 = df.fillna(10000) display(df1.head()) # 可以提供一个字典,这样就能够为不同的列,填充不同的值。 # 字典的key指定索引,value指定填充值。 df2 = df.fillna({ 3: 5000, 4:1000}) display(df2.head())
-
method:指定前值(上一个有效值)填充(pad / ffill),还是后值(下一个有效值)填充(backfill / bfill)。
# 我们可以使用method,来指定向前(后)填充。此种情况下,主要应用是记录之间有着紧密的关联(趋势)。例如,房价,股票。 # 使用上一个有效值进行填充。 display(df.fillna(method="ffill").head(6)) # 使用下一个有效值进行填充。 display(df.fillna(method="bfill").head(6))
-
limit:如果指定method,表示最大连续NaN的填充数量,如果没有指定method,则表示最大的NaN填充数量。
# limit参数。如果指定method,则表示最多连续填充。 # 如果没有指定method,则表示总共填充。 display(df.fillna(method="bfill", limit=1).head(6)) display(df.fillna(value=50000, limit=2).head(6))
-
inplace:指定是否就地修改,默认为False。
# 设置是否就地修改,默认为False。 df.fillna("aa", inplace=True) display(df.head(6))
2. 处理无效值
describe()检测无效值
可以通过DataFrame对象的describe方法查看数据的统计信息。不同类型的列,统计信息也不太相同。
# 如果DataFrame当中存在数值列,则describe值显示数值列。
display(df.describe())
# 数值列的统计与非数值列的统计,结果不同。
display(df[[0, 1, 2]].describe())
3 4 count 1098.000000 1098.000000 mean 143.082878 1017.034235 std 80.803922 550.759464 min 6.000000 51.390000 25%