Python_Pandas的ETL数据处理方法

# 导入及查看
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%
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Cryueh

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值