数据处理
数据处理指的是根据数据分析的目的,将收集到的数据进行加工、整理,形成适合数据分析的样式。主要分三个步骤来处理我们的数据,它们分别是:数据清洗、数据整理以及数据写入。
一、数据清洗
以下表数据为例:
这份数据索引为 1、3、4 的行完全重复。有一些数据的值为 NaN ,在 pandas 库中,NaN 代表缺失值,意思是这里的数据是空的。
在订单量、单价和销售额列中,我们能明显看到 0 和 999999999.0 的数值。首先,订单量如果为 0,那么这样的订单根本就不应该出现,这些数据也完整存在异常。
综上所述,这份数据同时存在缺失值、重复值以及异常值的问题,在进行数据处理时我们需要先将这些数据问题处理掉,这一过程也叫做数据清洗。
数据清洗的三个步骤
1.1处理缺失值
df.info() 能提炼出基本的数据信息,从而能让我们对于整体的数据有一个大概的印象
info—[ˈɪnfəʊ]—信息
# 查看 mask_data 的基本信息总结
mask_data.info()
运行结果:
其中主要包括:整体数据的总行数、各列数据类型统计、各列的列名、各列总共有多少非空数据、表格占用的系统空间等。
当非空数据与数据总量101942不一致时,说明这份数据有可能存在缺失值,处理这些缺失值的第一步,就是找到它们。
1.1.1查找数据中的缺失值
在 pandas 库中,我们可以使用 isna() 方法来查找 DataFrame 对象以及 Series 对象中的缺失值。它可以将查找结果以 DataFrame 对象或者 Series 对象的形式进行返回。
isna---伊斯纳
df.isna()返回的是 DataFrame 对象,Series.isna() 返回的就是 Series 对象。
返回对象中的内容都是布尔值,缺失数据会用 True 来表示,False 则代表这里的数据不缺失。
示例:
# 查看 mask_data 的缺失值
mask_data.isna()
从结果中我们可以直接看到数据前后 5 行的缺失情况,其中 True 的位置表示该位置的数据为缺失值。在 pandas 库中,除了直接输入 DataFrame 对象的名称能查看数据的前后 5 行之外,还可以使用df.head()或df.tail()方法查看数据。
对 DataFrame 对象使用 df.head() 方法默认可以查看数据的前 5 行,df.tail() 方法则默认可以查看数据的后 5 行
除了默认查看五行还可以在df.head()及df.tail()括号中填写数字,指定要看的行数
如:df.head(10) 查看前10行
head–[hed]–头 ,,, tail-- [teɪl] --n.尾;尾巴
示例:
# 查看数据后 5 行
mask_data.tail()
pandas 库中,NaN 代表的就是缺失数据。
对于缺失值,最简单的方法就是将含有缺失值的行直接删除,也可以给缺失值填充数据
1.1.2删除缺失值 dropna() (德普纳)
在 pandas 库中,可以使用 dropna() 方法直接删除 DataFrame 对象和 Series 对象中含有缺失值的数据
只要执行 df.dropna() 这一代码方法,就可以将 DataFrame 对象中包含缺失值的每一行全部删掉。
例:
# 删除所有缺失值
mask_data.dropna()
这时,当我们运行 mask_data.dropna() 代码返回的是一个删掉所有缺失数据的 DataFrame 对象,但这并不意味着它修改了 mask_data 数据,原mask_data 数据并没有改变,我们需要将 mask_data.dropna() 的运行结果重新赋值给 mask_data 变量,这样就可以将运行结果保存下来。
例:
# 删除所有缺失值
mask_data = mask_data.dropna()
# 查看数据基本信息总结
mask_data.info()
1.1.3
如果我们需要针对某几列的缺失数据进行删除,就需要用到df.dropna()的 subset 参数。
subset--- [ˈsʌbset] ---子集,分组;小组;
把要指定的列名写进中括号[]中,然后赋值给 subset 参数,就可以限定 dropna() 方法的删除范围。
比如我们想删掉除 test_data 中’品牌’、‘上牌时间’、 '里程数(km)'和 '保值率’四列数据缺失的行,可以如下书写代码:
test_data.dropna(subset=[‘品牌’, ‘上牌时间’, ‘里程数(km)’, ‘保值率’])
subset参数应是列表的形式。
总结图:
1.2处理重复值
第一步:1.2.1查找重复值:df.duplicated()
duplicated--- [ˈdjuːplɪkeɪtɪd‘] --复制,重复
我们可以直接使用 df.duplicated()方法来查找 DataFrame 对象中的重复数据。
使用 df.duplicated() 方法会返回一个 Series 对象,找出所有重复值。重复为 True,不重复为 False。
例:
in [21 ]
# 查找 mask_data 中的重复行
mask_data.duplicated()
Out[21 ]
0 False
1 False
2 False
3 True
4 True
...
100951 False
100952 False
100953 False
100954 False
100955 False
Length: 100956, dtype: bool
返回结果很长…我们完全没有办法用肉眼进行观察。
我们可以将 mask_data.duplicated() 返回的结果放入中括号 [ ] 中,用来索引 mask_data 数据,查看 mask_data 数据中重复的行。
例:
In [ 22 ]
1 # 查看 mask_data 中的重复数据
2 mask_data[mask_data.duplicated()]
Out [ 22 ]
订单编号 日期 省 订单量 单价 销售额
3 535a-4eca-8fa0-9cc54c66e11d 2020-01-01 河南 0.0 30.0 0.0
4 535a-4eca-8fa0-9cc54c66e11d 2020-01-01 河南 0.0 30.0 0.0
412 2b31-4392-be6e-19af71e40261 2020-01-09 河南 1.0 30.0 30.0
441 d707-4d5c-ac10-59d3fd3dc0bb 2020-01-10 广东 1.0 30.0 30.0
845 49f6-4bd5-97a5-aeb075a1c8c3 2020-01-16 湖北 8.0 40.0 320.0
... ... ... ... ... ... ...
100157 1ee1-41a6-8c0a-7c24f988689f 2020-06-25 湖北 8.0 30.0 240.0
100312 c72a-401d-8f11-39becb49d442 2020-06-26 湖北 9.0 30.0 270.0
100321 73f3-4d40-af4e-426548a7c539 2020-06-26 广东 3.0 30.0 90.0
100330 1265-4d27-a5c6-d3d6f44cd594 2020-06-26 广东 3.0 30.0 90.0
100772 a56d-4415-ad6e-020cdb154c35 2020-06-29 其他 0.0 30.0 0.0
448 rows × 6 columns
可以看到,这份数据中含有大量完全重复的行,这种重复数据并不具备分析的意义,而且会影响数据分析的结果,因此我们需要直接删除。
1.2.2删除重复值 df.drop_duplicates()
我们可以使用 pandas 库的 df.drop_duplicates() 方法直接删除 DataFrame 对象中重复出现的整行数据。
例:
In