当前位置:   article > 正文

数据仓库与数据挖掘实验练习6-7(实验四2024.5.22)

数据仓库与数据挖掘实验练习6-7(实验四2024.5.22)

tips:

列出虚拟环境:conda env list

激活虚拟环境:activate hi

进入jupyter-lab:jupyter lab

练习6

1. 处理字符串空格

  • 发现问题: 使用 values 属性查看数据时,如果发现 Name 列没有对齐,很可能是 Name 左右存在空格。
  • 确认问题: 使用 inspection['Name'].values 查看 Name 列的值,确认是否存在空格。
  • 解决问题:
    • 使用 str 属性访问字符串方法: inspection['Name'] = inspection['Name'].str.strip()
    • lstrip(): 去掉字符串左边空格
    • rstrip(): 去掉字符串右边空格
    • strip(): 去掉字符串两边空格
  • 覆盖原数据: 使用 inspection['Name'] = inspection['Name'].str.strip() 将处理后的数据覆盖原数据,并再次使用 values 属性查看,确认空格已被去除。

2. 对所有列的字符串去空格

  • columns 属性: 使用 df.columns 查看 DataFrame 的所有列名。
  • 迭代处理: columns 属性返回的是一个可迭代的 Index 对象,可以使用循环对每个列进行处理。
    1. for column in df.columns:
    2. df[column] = df[column].str.strip()

3. 大小写转换

  • str.lower(): 将字符串转换为小写。
  • str.upper(): 将字符串转换为大写。
  • capitalize(): 将字符串首字母大写,其余字母小写。
  • title(): 将字符串中每个单词的首字母大写,其余字母小写。

4. 提取每行 Risk 的数字

  • unique(): 可以用于检查某一列中有哪些不同的值,方便我们了解数据的结构,例inspections['Risk'].unique()

16a7bbc6d6984883985a0271ce84a44e.png

1. "All":

  • All 表示所有风险等级都适用,它是一个特殊的类别,不同于 "High", "Medium", "Low" 等具体等级。
  • 在数据分析中,你需要根据具体情况决定如何处理 All
    • 保留: 如果 All 有其特殊含义,可以将其作为单独的类别进行分析。
    • 替换: 可以根据上下文将 All 替换为更具体的风险等级,例如,如果所有风险等级都适用,可以将其替换为 "High"。
    • 删除: 如果 All 没有提供额外信息,可以将其从数据中删除。

2. "nan":

  • nan 代表缺失值,表示该数据点没有记录风险等级信息。
  • 处理 nan 的方法有很多:
    • 删除: 最简单的处理方法是删除包含 nan 的行,但可能会损失信息。
    • 填充: 可以用其他值填充 nan,例如:
      • 众数填充: 用最常见的风险等级填充。
      • 均值填充: 如果是数值型风险等级,可以使用均值填充。
      • 模型预测: 可以使用机器学习模型预测缺失的风险等级。
    • 保留: 在某些情况下, nan 本身也包含信息,可以将其作为单独的类别进行分析。
  • 正则表达式: 使用 str.extract() 方法,结合正则表达式可以高效地提取数字。

    df['Risk_Num'] = df['Risk'].str.extract(r'(\d+)') 
    

#删除nan数据,保持格式一致
inspections = inspections.dropna(subset=['Risk'])

# 替换数据
inspections = inspections.replace(to_replace='All', value='Risk 4 (Extreme)')

5. 替换数据

  • replace(): 用于替换数据,可以替换单个值或多个值。

    1. # 替换单个值
    2. df['Risk'] = df['Risk'].replace('Low', '低')
    3. # 替换多个值
    4. df['Risk'] = df['Risk'].replace({'Low': '低', 'High': '高'})

6. 提取 Risk 中的数字(切片操作)

8214a7fc210e40b3a6424dbbe2cdbd65.png

3a716adea133413f8284e541e4891446.png

  • slice(): 用于提取字符串的一部分,可以通过索引或切片语法实现。
  • inspections['Risk'].str.slice(5, 6)
  • inspections['Risk'].str[5:6]
    • 提取 "high"、"medium"、"low"、"all":
      df['Risk_Level'] = df['Risk'].str.slice(start=0, stop=-4) 
      
    • 去括号:
      df['Risk_Level'] = df['Risk_Level'].str.strip('()')
      

7. 提取包含特定数据的行

93d5eda5cf42493f884f2ad705148e7d.png

  • str.contains(): 用于判断字符串是否包含某个子字符串,返回布尔值。可以结合布尔索引提取包含特定数据的行。

    1. # 提取包含 "High" 的行
    2. high_risk = df[df['Risk'].str.contains("High")]

8. 找出以特定字符串开头/结尾的数据

  • str.startswith(): 判断字符串是否以某个子字符串开头,返回布尔值。

  • str.endswith(): 判断字符串是否以某个子字符串结尾,返回布尔值。

    1. # 提取以 "Low" 开头的 Risk 数据
    2. low_start = df[df['Risk'].str.startswith("Low")]
    3. # 提取以 "(1)" 结尾的 Risk 数据
    4. risk_1 = df[df['Risk'].str.endswith("(1)")]

c9ed3d063ec44ffd9f3f4e3f35d94f3a.png

4fe1ae3cc9a1475dbd315bc50b39208b.png

9. str.len()

  • 用于获取字符串的长度。

    1. # 获取 Risk 列字符串长度
    2. df['Risk_Length'] = df['Risk'].str.len()

10. 字符串处理(按 "-"、" " 等方式划分)

  • str.split(): 用于根据指定分隔符分割字符串,返回一个列表。

    • split(): 默认按空格分割。
    • split(pat=" "): 按空格分割。
    • split(pat=" ", n=1): 按空格分割,最多分割一次。
    1. # 按空格分割 Risk 列
    2. df['Risk_Parts'] = df['Risk'].str.split()
    3. # 按 "-" 分割,最多分割一次
    4. df['Risk_First_Part'] = df['Risk'].str.split("-", n=1)
    5. # 提取First name
    6. # 从每行的分割后的list中按照list的index提取
    7. customers['Name'].str.split(' ', n=1).str.get(0)
    8. # 通过get(index)获取list中指定index处的值
    9. # 获取last name
    10. customers['Name'].str.split(' ', n=1).str.get(1)
    11. # 将 split 后的多个部分分别作为列
    12. # 返回DataFrame
    13. customers['Name'].str.split(pat=' ', n=1, expand=True)
    14. # 如果没有控制 split 后得到的 list 的长度
    15. # pandas 会自动取最长的len(list), 且缺失值处显示 None
    16. customers['Name'].str.split(pat=' ', expand=True)

11.给原来的DataFrame添加新列

# 把Name拆为1 、 2
customers[
['Name1','Name2']
] = customers['Name'].str.split(pat = ' ', n = 1, expand=True)

1f12cefd7e0246719127cfe959c8afc6.png

f74b696fa8cd41dc82101fc7f62925df.png

 练习题

# customers.csv包括一个地址列。
# 每个地址由一条街道、城市、州和邮政编码组成。
# 分离这四个值;
# 将它们分配到DataFrame中新的Street、City、State和Zip列;
# 然后删除地址列。

  1. customers
  2. customers['Address'].values
  3. split_Address = customers['Address'].str.split(', ', expand=True)
  4. split_Address
  5. customers[['Street', 'City', 'State', 'Zip']] = split_Address
  6. customers = customers.drop(labels='Address', axis='columns')
  7. customers

练习7

MultiIndex

MultiIndex(多级索引) 允许使用多个索引级别来组织数据,从而创建出层次化的数据结构。 这使得数据的分析和操作更加灵活和强大。

1. 创建

创建 MultiIndex 的方法有很多:

  • from_tuples: 从元组列表创建 MultiIndex

  1. import pandas as pd
  2. tuples = [(1, 'a'), (1, 'b'), (2, 'a'), (2, 'b')]
  3. index = pd.MultiIndex.from_tuples(tuples, names=['first', 'second'])
  4. data = pd.DataFrame({'A': [1, 2, 3, 4]}, index=index)
  5. print(data)
  • from_arrays: 从数组列表创建 MultiIndex

  1. arrays = [[1, 1, 2, 2], ['a', 'b', 'a', 'b']]
  2. index = pd.MultiIndex.from_arrays(arrays, names=['first', 'second'])
  3. data = pd.DataFrame({'A': [1, 2, 3, 4]}, index=index)
  4. print(data)
  • from_product: 从多个迭代器创建 MultiIndex

  1. iterables = [[1, 2], ['a', 'b']]
  2. index = pd.MultiIndex.from_product(iterables, names=['first', 'second'])
  3. data = pd.DataFrame({'A': [1, 2, 3, 4]}, index=index)
  4. print(data)

2. 访问数据

使用 MultiIndex 可以更方便地访问和操作数据:

  • loc: 使用标签进行访问

  1. # 获取 first1,second 为 'a' 的数据
  2. print(data.loc[(1, 'a')])
  3. # 获取 first1 的所有数据
  4. print(data.loc[1])
  5. # 获取 second 为 'a' 的所有数据
  6. print(data.loc[:, 'a'])
  • iloc: 使用位置进行访问

  1. # 获取第一行数据
  2. print(data.iloc[0])
  3. # 获取前两行数据
  4. print(data.iloc[:2])
  • xs: 访问特定级别的值

  1. # 获取 first1 的所有数据
  2. print(data.xs(1, level='first'))
  3. # 获取 second 为 'a' 的所有数据
  4. print(data.xs('a', level='second'))

3. 数据操作

MultiIndex 允许对数据进行更灵活的操作:

  • 排序: 可以根据不同级别的索引进行排序

  1. # 根据 first 级别升序排序
  2. print(data.sort_index(level='first'))
  3. # 根据 second 级别降序排序
  4. print(data.sort_index(level='second', ascending=False))
  • 分组: 可以根据不同级别的索引进行分组

  1. # 根据 first 级别进行分组
  2. grouped = data.groupby(level='first')
  3. # 计算每个组的平均值
  4. print(grouped.mean())
  • 切片: 可以根据不同级别的索引进行切片

  1. # 获取 first 级别为 1 的所有数据
  2. sliced = data.loc[1]
  3. # 获取 second 级别为 'a' 的所有数据
  4. sliced = data.loc[:, 'a']

查询

可以理解为数据降维

15f41e7968854c239e23f62664e3f294.png

4665726472bb489fb22aa144379f6ff8.png

  1. import pandas as pd
  2. address = ('8890 Flair Square', 'Toddside', 'IL', '37206')
  3. address
  4. address = [
  5. ("8809 Flair Square", "Toddside", "IL", "37206"),
  6. ("9901 Austin Street", "Toddside", "IL", "37206"),
  7. ("905 Hogan Quarter", "Franklin", "IL", "37206"),
  8. ]
  9. pd.MultiIndex.from_tuples(tuples=address)
  10. # 给每个level取个名字
  11. row_index = pd.MultiIndex.from_tuples(
  12. tuples=address, names=['Street', 'City', 'State', 'Zip'])
  13. row_index
  14. # 使用MultiIndex创建DataFrame
  15. # 对 DataFrame 的行使用 MultiIndex
  16. data = [
  17. ['A', 'B+'],
  18. ['C+', 'C'],
  19. ['D-', 'A']
  20. ]
  21. columns = ['Schools' ,'Cost of Living']
  22. area_grades = pd.DataFrame(
  23. data=data, index=row_index, columns=columns
  24. )
  25. area_grades
  26. area_grades.columns
  27. area_grades.index
  28. # 对 DataFrame 的列使用 MultiIndex
  29. column_index = pd.MultiIndex.from_tuples(
  30. [
  31. ("Culture", "Restaurants"),
  32. ("Culture", "Museums"),
  33. ("Services", "Police"),
  34. ("Services", "Schools"),
  35. ]
  36. )
  37. column_index
  38. #row_index 需要3行数据
  39. #column_index 需要4列数据
  40. #所以需要新建一个3×4的dataframe
  41. data = [
  42. ["C-", "B+", "B-", "A"],
  43. ["D+", "C", "A", "C+"],
  44. ["A-", "A", "D+", "F"]
  45. ]
  46. pd.DataFrame(
  47. data=data, index=row_index, columns=column_index
  48. )

neighborhoods(行列名操作)

  1. neighborhoods = pd.read_csv('neighborhoods.csv')
  2. neighborhoods
  3. # 通过index_col指定前三列为index列。列的序号从0开始,所以指定0, 1, 2
  4. # pandas 自动为DataFrame创建用于行的MultiIndex
  5. neighborhoods = pd.read_csv('neighborhoods.csv', index_col=[0, 1, 2])
  6. neighborhoods
  7. # 通过 header 指定前两行是列名
  8. neighborhoods = pd.read_csv(
  9. 'neighborhoods.csv',
  10. index_col=[0, 1, 2],
  11. header=[0, 1]
  12. )
  13. neighborhoods
  14. neighborhoods.info()
  15. # 行 index lebel
  16. neighborhoods.index

  1. # 列 index label
  2. neighborhoods.columns
  3. # MultiIndex 是由多个 Index 组合而成的
  4. neighborhoods.index.names
  5. # 通过给定的数字序号或者level名字获取指定level的所有index值
  6. # neighborhoods.index.get_level_values(1)
  7. neighborhoods.index.get_level_values('City')
  8. #给列设置名字
  9. neighborhoods.columns.names
  10. # 给column index设置名字(两层名字)
  11. neighborhoods.columns.names = ['Category', 'Subcategory']
  12. neighborhoods.columns.names
  13. # 获取column MultiIndex的值(按实际的列返回)
  14. # neighborhoods.columns.get_level_values(0)
  15. neighborhoods.columns.get_level_values('Category')
  16. neighborhoods.head(1)
  17. #有多少不同值
  18. neighborhoods.nunique()

排序

  1. # 按照index排序,默认为升序
  2. # 先在State level上进行排序,然后是City level, 最后是Street level
  3. neighborhoods.sort_index()
  4. # 先在State level上进行排序,然后是City level, 最后是Street level
  5. # 每次排序都使用降序
  6. neighborhoods.sort_index(ascending=False)
  7. # 通过一个包含boolean的list指定每个level的排序规则
  8. # 第一层升序,第二层降序,第三层升序
  9. neighborhoods.sort_index(ascending=[True, False, True])
  10. # 在指定level上进行排序
  11. # neighborhoods.sort_index(level=1)
  12. neighborhoods.sort_index(level='City')
  13. # 按照指定的level顺序进行排序
  14. # neighborhoods.sort_index(level=[1, 2])
  15. # 先按City排序,后对Street排序
  16. neighborhoods.sort_index(level=['City', 'Street'])
  17. # 先按City升序排序,再按照Street降序排序
  18. neighborhoods.sort_index(level=['City', 'Street'], ascending=[True, False])
  19. # 对列排序
  20. # neighborhoods.sort_index(axis=1)
  21. neighborhoods.sort_index(axis='columns')
  22. # 对列的多级索引按Subcategory排序,降序
  23. neighborhoods.sort_index(axis=1, level='Subcategory', ascending=False)
  24. # 修改DataFrame,使用传出来的值(默认升序)
  25. neighborhoods = neighborhoods.sort_index(ascending=True)
  26. neighborhoods

构造数据

  1. data = [
  2. [1, 2],
  3. [3, 4]
  4. ]
  5. # 第一行A,第二行B
  6. # 第一列X,第二例Y
  7. df = pd.DataFrame(
  8. data=data, index=['A', 'B'], columns=['X', 'Y']
  9. )
  10. df
  11. df['X']

neighborhoods(提取多列)

  1. neighborhoods
  2. # 在使用了column MultiIndex的情况下
  3. # 使用一个值进行查询时,pandas只会在最外层的level中查询该值
  4. neighborhoods['Services']
  5. # 'Schools'不是最外层的level
  6. try:
  7. neighborhoods['Schools']
  8. except KeyError as e:
  9. print('KeyError:', e)
  10. # 第一层列索引Services,第二层列索引Schools
  11. neighborhoods[('Services', 'Schools')]
  12. type(neighborhoods[('Services', 'Schools')])
  13. # 按照指定顺序显示数据(指定多维数组中具体查看哪一列)
  14. # 第一层列索引中有Services索引中的Schools索引
  15. neighborhoods[[('Services', 'Schools'), ('Culture', 'Museums')]]
  16. # 交换顺序显示
  17. neighborhoods[[('Culture', 'Museums'), ('Services', 'Schools')]]
  18. # 避免写错,拆开写
  19. columns = [
  20. ('Services', 'Schools'),
  21. ('Culture', 'Museums')
  22. ]
  23. neighborhoods[columns]

neighborhoods(提取多行)

  1. # 提取多行
  2. df
  3. df.loc['A']
  4. df.iloc[1]
  5. # 行索引(根据行索引定位该行数据)
  6. neighborhoods.loc[('TX', 'Kingchester', '534 Gordon Falls')]
  7. # 如果只传入一个label,则只匹配行的最外层 level
  8. # 即:State = 'CA'
  9. # 类似直角坐标系(State为X,City为Y,Street为Z)根据某一坐标匹配其他坐标
  10. # 可以视为行索引上的降维
  11. neighborhoods.loc['CA']
  12. # 多级索引
  13. neighborhoods.loc['CA', 'Dustinmouth']
  14. # 在行的最外层label中搜索 CA,在列的最外层label中搜索Culture
  15. neighborhoods.loc['CA', 'Culture']
  16. # neighborhoods.loc['CA', 'Culture']这种写法有歧义
  17. # 没有歧义的写法(只看行索引)
  18. neighborhoods.loc[('CA', 'Dustinmouth')]
  19. # 注意最后的逗号(左边是行索引,右边是列索引)使用元组,注意逗号隔开
  20. neighborhoods.loc[('CA', 'Dustinmouth'), ('Services', )]
  21. neighborhoods.loc[('CA', 'Dustinmouth'), ('Services', 'Schools')]
  22. # 选择连续的行
  23. # 区间 ['NE', 'NH'],考虑区间左右两边是否取值
  24. # 只传入最外层值,故在最外层查找
  25. neighborhoods['NE':'NH']
  26. # 从第一层到第二层
  27. neighborhoods.loc[('NE', 'Shawnchester') : ('NH', 'North Latoya')]
  28. # 避免写错,拆开写
  29. start = ('NE', 'Shawnchester')
  30. end = ('NH', 'North Latoya')
  31. neighborhoods.loc[start : end]
  32. start = ('NE', 'Shawnchester')
  33. end = ('NH', )
  34. neighborhoods.loc[start : end]

iloc(使用数字类型的索引进行定位)

  1. # iloc
  2. neighborhoods.iloc[25]
  3. # row with index position 25, column with index position 2
  4. neighborhoods.iloc[25, 2]
  5. # row index 是25和30的2行数据
  6. neighborhoods.iloc[[25, 30]]
  7. # 行区间 [25, 30)
  8. neighborhoods.iloc[25:30]
  9. # 列区间 [1, 3)
  10. neighborhoods.iloc[25:30, 1:3]
  11. neighborhoods.iloc[-4:, -2:]
  12. # 找出所有City为Lake Nicole的数据
  13. # neighborhoods.xs(key='Lake Nicole', level=1)
  14. neighborhoods.xs(key='Lake Nicole', level='City')
  15. # 查询Subcategory中Museums列的数据
  16. neighborhoods.xs(key='Museums', axis=1, level='Subcategory')
  17. neighborhoods.xs(key=('AK', '238 Andrew Rue'), level=['State', 'Street'])
  18. neighborhoods
  19. #重新指定MultiIndex中各个index的顺序
  20. new_order = ['City', 'State', 'Street']
  21. neighborhoods.reorder_levels(order=new_order)
  22. # 使用数字指定位置
  23. neighborhoods.reorder_levels(order=[1, 0, 2])


 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/不正经/article/detail/711811
推荐阅读
相关标签
  

闽ICP备14008679号