数据分析基础01|数据清洗问题

本文以此图为例

列坐标中,第 0 列代表的是序号,第 1 列代表的会员的姓名,第 2 列代表年龄,第 3 列代表体重,第 4~6 列代表男性会员的三围尺寸,第 7~9 列代表女性会员的三围尺寸。

在这里插入图片描述

1.缺失值

在数据中有NaN和“-”,代表缺失值,如何补足缺失值呢?

  1. 删除数据缺失的记录
  2. 使用当前列的均值
  3. 使用当前列出现频率最高的数据

2.空行

一整行都为空:直接删除全空的行

df.dropna(how="all",inplace=True)

3.列数据单位不统一

在体重一列,出现的单位有:kg、lbs。我们需要统一单位。

# 获取 weight 数据列中单位为 lbs 的数据
rows_with_lbs = df['weight'].str.contains('lbs').fillna(False)
print(df[rows_with_lbs])
# 将 lbs转换为 kgs, 2.2lbs=1kgs
for i,lbs_row in df[rows_with_lbs].iterrows():
  # 截取从头开始到倒数第三个字符之前,即去掉lbs。
  weight = int(float(lbs_row['weight'][:-3])/2.2)
  df.at[i,'weight'] = '{}kgs'.format(weight) 

4.非ASCII字符

直接删除非ASCII字符

# 删除非 ASCII 字符
df['first_name'].replace({r'[^\x00-\x7F]+':''}, regex=True, inplace=True)
df['last_name'].replace({r'[^\x00-\x7F]+':''}, regex=True, inplace=True)

5.一列有多个参数

一列中包含不止一个参数的情况需要拆分字段,尽量使字段信息不可再分。

# 切分名字,删除源数据列
df[['first_name','last_name']] = df['name'].str.split(expand=True)
df.drop('name', axis=1, inplace=True)

6.重复数据

需要去重

# 删除重复数据行
df.drop_duplicates(['first_name','last_name'],inplace=True)

7.完整代码

import pandas as pd
from pandas import DataFrame

# 将Excel存入Dataframe
df = pd.read_excel('accountMessage.xlsx')
# print(df)


# 删除空行和没用的列,这一步要在填充缺失值前做,不然填充完之后就没空行了
df = df.drop(['\t', 0], axis=1)
df.dropna(how='all', inplace=True)
# print(df)


# 用均值填充年龄缺失值
df[2].fillna(df[2].mean(), inplace=True)
df[2] = df[2].apply(int)
# print(df)


# 统一体重列单位为kg
rows_lbs = df[3].str.contains('lbs').fillna(False)
# print(df[rows_lbs])
for i, lbs_row in df[rows_lbs].iterrows():  # 使用iterrows()对df进行遍历
    weight = int(float(lbs_row[3][:3]) / 2.2)  # lbs->kg换算
    df.at[i, 3] = '{}kg'.format(weight)

rows_kgs = df[3].str.contains('kgs').fillna(False)  # 把kgs改成kg
for i, lbs_kgs in df[rows_kgs].iterrows():
    weight = int(float(lbs_row[3][:3]))
    df.at[i, 3] = '{}kg'.format(weight)
# print(df)

# 拆分姓名列
df[['first_name', 'last_name']] = df[1].str.split(expand=True)
df.drop(1, axis=1, inplace=True)
# print(df)

# 去重
df.drop_duplicates(['first_name', 'last_name'], inplace=True)
# print(df)

#改个列名,调整列顺序
df.columns = ['Age', 'Weight', 'BWH1_man', 'BWH2_man', 'BWH3_man',
              'BWH1_woman', 'BWH2_woman', 'BWH3_woman', 'first_name', 'last_name']
df = df[['first_name', 'last_name', 'Age', 'Weight', 'BWH1_man', 'BWH2_man', 'BWH3_man',
         'BWH1_woman', 'BWH2_woman', 'BWH3_woman']]
# print(df)

#存入csv
df.to_csv('Message.csv')

结果如下

在这里插入图片描述

  • 3
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 9
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值