概述
Ali_Mum_Baby 是一个数据集,其中包含 900 多万条儿童信息(生日和性别),这些信息由消费者提供,他们分享这些信息是为了获得更好的推荐或搜索结果。
数据说明
它包含消费者在淘宝或天猫上提供的 9,000,000 多个儿童的生日和性别。
列名 | 描述 |
---|---|
user_id | 用户ID (Bigint)。 |
birthday | 儿童生日(例如:20130423)。 |
gender | 儿童性别(“0” 表示女性,“1” 表示男性,“2” 表示未知)。 |
Tianchi_mum_baby_trade_history
本表包含淘宝会员的历史交易信息。
列名 | 描述 |
---|---|
item_id | 商品ID (Bigint)。 |
user_id | 用户ID (Bigint)。 |
cat_id | 类别ID (Bigint)。 |
cat1 | 根类别ID (Bigint)。 |
property | 相应商品的属性 (String)。 |
buy_mount | 购买数量 (Bigint)。 |
day | 时间戳。 |
典型研究课题
- 根据父母的购买行为预测子女的年龄
- 根据用户子女的信息(年龄、性别等)预测用户会购买何种商品。
具体步骤
-
**数据准备:**创建一个单独的文件夹来存放数据集和Notebook,保持文件结构的整洁。
-
数据读取:
- 使用
pandas
库的read_csv
函数读取CSV文件并存储在变量original_data
中。 - 使用
head()
函数预览数据的前几行。
import pandas as pd original_data = pd.read_csv('data/(sample)sam_tianchi_mum_baby_trade_history.csv') original_data.head()
- 使用
-
数据评估:
-
使用
info()
方法了解数据的基本信息,包括各列的非空值数量和数据类型。original_data.info() ## print <class 'pandas.core.frame.DataFrame'> RangeIndex: 29971 entries, 0 to 29970 Data columns (total 7 columns): # Column Non-Null Count Dtype --- ------ -------------- ----- 0 user_id 29971 non-null int64 1 auction_id 29971 non-null int64 2 cat_id 29971 non-null int64 3 cat1 29971 non-null int64 4 property 29827 non-null object 5 buy_mount 29971 non-null int64 6 day 29971 non-null int64 dtypes: int64(6), object(1) memory usage: 1.6+ MB
-
对数据进行初步的结构和内容评估:
- 整洁度:每列是一个变量,每行是一个观察值。
- 缺失数据:使用
isnull()
和布尔索引筛选出缺失值。 - 重复数据:检查唯一标识符的重复情况。
- 不一致数据:使用
value_counts()
方法检查某些列的值是否一致。 - 无效或错误数据:使用
describe()
方法检查数值列是否存在异常值。
# 使用 isnull() 检查每个值是否为缺失值 null_data = original_data.isnull() null_data.head()
null_counts = original_data.isnull().sum() null_counts
-
-
数据清理
-
缺失值处理
# 处理缺失值 data = original_data.dropna() # 删除包含缺失值的行 null_counts = data.isnull().sum() # 观察处理后的数据 null_counts
-
重复行处理
# 删除重复数据 data = data.drop_duplicates()
-
数据类型转换
# 转换数据类型 data['user_id'] = data['user_id'].astype(str) data['auction_id'] = data['auction_id'].astype(str) data['cat_id'] = data['cat_id'].astype(str) data['cat1'] = data['cat1'].astype(str) data['day'] = pd.to_datetime(data['day'], format='%Y%m%d') data.head()
-
列名规范
# 规范化列名 data.columns = [col.lower() for col in data.columns] cleaned_data = data
-
保存清洗后的数据
# 保存清洗后的数据到新文件 cleaned_file_path = 'data/cleaned_data.csv' cleaned_data.to_csv(cleaned_file_path, index=False)
cleaned_data.info() ## print <class 'pandas.core.frame.DataFrame'> Index: 29827 entries, 0 to 29970 Data columns (total 7 columns): # Column Non-Null Count Dtype --- ------ -------------- ----- 0 user_id 29827 non-null object 1 auction_id 29827 non-null object 2 cat_id 29827 non-null object 3 cat1 29827 non-null object 4 property 29827 non-null object 5 buy_mount 29827 non-null int64 6 day 29827 non-null datetime64[ns] dtypes: datetime64[ns](1), int64(1), object(5) memory usage: 1.8+ MB
-
获取数据
常见的数据格式
json【JavaScript Object Notation】
# json 对象
{
"id" : "1",
"type": "article",
"title": "working with JSON data",
"created": "2099-12-18T14:56:29.000Z"
}
# json 数组
[
{
"title": "A Light in the Attic",
"price": "£51.77"
},
{
"title": "Tipping the Velvet",
"price": "£53.74"
}
]
通过python读取和解析json——一键将格式转换为DataFrame
import numpy as np
df = pd.read_json("./xxx.json")
CSV【Comma-Separated Values】
姓名,考试1,考试2,考试3
小陈,85,95,92
小李,91,92,94
小王,86,81,89
小张,79,89,95
小赵,96,91,91
小周,81,89,92
import pandas as pd
df = pd.read_csv("xxx.csv")
df.head(3)
评估数据
具体分为两个方面:数据结构和数据内容。
数据结构
- 每列是一个变量:每列数据应该代表一个独立的变量。
- 每行是一个观察值:每行数据应该代表一个独立的观察值。
- 每个单元格是一个值:每个单元格应该只有一个值,不包含多个信息。
数据内容
- 丢失数据:数据中有空缺值,可能会影响分析结果。
- 重复数据:数据中有重复的记录,可能是数据录入错误。
- 不一致数据:数据中存在不同表示方式的相同信息,如单位不一致、全称与缩写混用等。
- 无效或错误数据:数据不符合逻辑或明显错误,例如负数的身高。
数据清洁和整洁的重要性
提供了一些方法来评估和检测数据集中的问题。以下是段落的总结和关键点:
- 数据整洁性 vs. 数据干净度:
- 数据的整洁度(结构性问题)比干净度(内容性问题)更容易被发现和评估。整洁度问题类似于书架是否整齐,而干净度问题则类似于书页是否有污渍。
- 每列只能表示一个变量,每行是一个观察值,每个单元格是一个值是数据整洁的基本规则。
- 使用 DataFrame 的 info 方法:
- info 方法可以提供数据概况信息,包括列名和对应的数据类型,有助于快速了解数据结构。
- 列名可以透露关于数据结构的信息,例如带年份的列名可能违反了每列只能表示一个变量的规则。
- 查看数据部分内容:
- 使用 head 或 tail 方法查看数据的开头或结尾部分,或者使用 sample 方法随机查看部分数据。
- 如果数据列数太多或值太长,可以通过 set_option 方法调整显示上限。
- 检测空缺值:
- info 方法可以显示每列非空缺值的数量,通过与行数对比可发现空缺值。
- isnull 方法可以检查值是否为空缺值,并返回布尔值组成的 Series 或 DataFrame。
- sum 方法可以对布尔值进行求和,以计算空缺值的数量。
- 通过条件筛选方法,可以提取出包含空缺值的行。
- 检测重复数据:
- duplicated 方法可以检查 Series 或 DataFrame 中的重复值。对 DataFrame 调用时,只有当整行数据完全一样时才会标记为重复。
- 可以使用 subset 参数指定需要检查重复的多个变量。
- 检测不一致数据和无效数据:
- 使用 value_counts 方法查看各个值的个数,帮助发现同一目标的不同表示。
- 使用 sort_values 方法和 describe 方法可以帮助发现异常值或离谱的数据。
- 评估数据的目的是为了采取进一步行动:
- 数据评估的最终目的是为了清洗和改进数据质量。
数据清洗
- 检查和处理索引或列名:
- 确保索引或列名有意义。如果索引或列名混乱,应该对它们进行重命名或重新排序,以便理解数据。
- 处理结构性问题:
- 确保每列是一个变量,每行是一个观察值,每个单元格是一个值。
- 如果每列是观察值,每行是变量,需要对行和列进行转置。
- 如果某列包含了多个变量,需要对列进行拆分,确保每列只包含一种变量。
- 如果每行包含了多个观察值,需要对行进行拆分,确保每行只包含一个观察值。
- 结构性问题处理后,数据通常会从宽数据变成长数据,以便后续高效的程序处理。
- 处理内容性问题:
- 丢失数据处理:
- 已知实际值:可以手动填充。
- 丢失值不影响分析:可以忽略丢失值。
- 关键变量丢失:删除包含空缺值的行。
- 填充值:使用平均数、中位数、众数等进行填充。
- 重复数据处理:找到重复数据后删除,避免影响分析结论。
- 不一致数据处理:统一同一含义的不同表达方式,保留一种表达方式并替换其他表达方式。
- 无效或错误数据处理:
- 删除无效或错误数据,或替换成其他值(如当前平均值)。
- 丢失数据处理:
- 编程相关的其他处理:
- 数据类型转换:
- 将不适合的数值类型(如手机号)转换为字符串类型。
- 将适合逻辑判断的字符串类型(如"是"和"否")转换为布尔值(True和False),以便后续分析。
- 数据类型转换:
示例处理方式:
- 结构性问题示例:
- 转置数据:当行和列表示的内容不符合预期时,将其转置。
- 拆分列:将包含多个变量的列拆分成多个单一变量的列。
- 拆分行:将包含多个观察值的行拆分成单一观察值的行。
- 内容性问题示例:
- 丢失数据处理:
- 填充已知值:手动更新表格数据。
- 忽略丢失值:分析时自动忽略。
- 删除行:移除包含空缺值的行。
- 填充值:用统计方法(如平均数)填充空缺值。
- 删除重复数据:删除发现的重复行。
- 统一不一致数据:对同一含义的不同表达方式进行统一。
- 处理无效数据:删除或替换不符合常理的值。
- 丢失数据处理:
- 编程相关处理示例:
- 数据类型转换:将手机号从整数类型转换为字符串类型,将“是”和“否”转换为布尔值。
如何使用 pandas 库来清理和重命名 DataFrame 的索引和列名
重命名索引和列名
- 使用 rename 方法:
- 重命名索引:使用
index
参数传入一个字典,键为原索引名,值为新索引名。 - 重命名列名:使用
columns
参数传入一个字典,键为原列名,值为新列名。
- 重命名索引:使用
- 两种重命名方法:
- 返回新 DataFrame:默认情况下,
rename
方法返回一个修改后的新 DataFrame,但不改变原始 DataFrame。 - 原地修改:通过传入
inplace=True
参数,直接修改原始 DataFrame 而不返回新 DataFrame。
- 返回新 DataFrame:默认情况下,
- 批量重命名:
- 传入字典:适用于少量列或索引的重命名。
- 传入函数:适用于批量重命名。可以传入一个函数来操作列名或索引。例如,将所有列名变为大写,可以使用
str.upper
方法。
- 字符串操作方法:
- Pandas 提供了许多针对字符串 Series 的操作方法,可以通过
pandas.Series.str
来访问这些方法,如upper
、lower
等。
- Pandas 提供了许多针对字符串 Series 的操作方法,可以通过
其他索引相关操作
- 设置新索引:
- 使用
set_index
方法,通过传入列名来设置新的索引,返回一个新的 DataFrame。
- 使用
- 重设索引:
- 使用
reset_index
方法,将索引重设为初始默认位置索引,并将原索引值变为一列,返回一个新的 DataFrame。
- 使用
- 排序索引和列名:
- 使用
sort_index
方法对索引或列名进行排序。 - 默认
axis=0
对索引排序,axis=1
对列名排序。
- 使用
- 注意事项:
- 所有这些方法(
rename
、set_index
、reset_index
、sort_index
)默认不会修改原始 DataFrame,而是返回一个新的 DataFrame。 - 使用
inplace=True
参数可以直接修改原始 DataFrame,但这时方法不会返回新的 DataFrame。
- 所有这些方法(
实践示例
以下是一些具体操作示例:
import pandas as pd
# 创建示例 DataFrame
data = {'A': [1, 2, 3], 'B': [4, 5, 6], 'C': [7, 8, 9]}
df = pd.DataFrame(data)
# 重命名列名
df_renamed = df.rename(columns={'A': 'Alpha', 'B': 'Beta'})
# 重命名索引
df_renamed_index = df.rename(index={0: 'first', 1: 'second'})
# 批量重命名列名为大写
df_upper = df.rename(columns=str.upper)
# 设置新索引
df_set_index = df.set_index('A')
# 重设索引
df_reset_index = df_set_index.reset_index()
# 对索引排序
df_sorted_index = df.sort_index()
# 对列名排序
df_sorted_columns = df.sort_index(axis=1)
# 原地修改示例
df.rename(columns={'A': 'Alpha'}, inplace=True)
df.set_index('Alpha', inplace=True)
这些操作可以帮助你更好地管理和清理 DataFrame 的索引和列名。