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
对象,可以使用循环对每个列进行处理。for column in df.columns: df[column] = df[column].str.strip()
3. 大小写转换
str.lower()
: 将字符串转换为小写。str.upper()
: 将字符串转换为大写。capitalize()
: 将字符串首字母大写,其余字母小写。title()
: 将字符串中每个单词的首字母大写,其余字母小写。
4. 提取每行 Risk 的数字
-
unique()
: 可以用于检查某一列中有哪些不同的值,方便我们了解数据的结构,例inspections['Risk'].unique()
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()
: 用于替换数据,可以替换单个值或多个值。# 替换单个值 df['Risk'] = df['Risk'].replace('Low', '低') # 替换多个值 df['Risk'] = df['Risk'].replace({'Low': '低', 'High': '高'})
6. 提取 Risk 中的数字(切片操作)
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('()')
- 提取 "high"、"medium"、"low"、"all":
7. 提取包含特定数据的行
-
str.contains()
: 用于判断字符串是否包含某个子字符串,返回布尔值。可以结合布尔索引提取包含特定数据的行。# 提取包含 "High" 的行 high_risk = df[df['Risk'].str.contains("High")]
8. 找出以特定字符串开头/结尾的数据
-
str.startswith()
: 判断字符串是否以某个子字符串开头,返回布尔值。 -
str.endswith()
: 判断字符串是否以某个子字符串结尾,返回布尔值。# 提取以 "Low" 开头的 Risk 数据 low_start = df[df['Risk'].str.startswith("Low")] # 提取以 "(1)" 结尾的 Risk 数据 risk_1 = df[df['Risk'].str.endswith("(1)")]
9. str.len()
-
用于获取字符串的长度。
# 获取 Risk 列字符串长度 df['Risk_Length'] = df['Risk'].str.len()
10. 字符串处理(按 "-"、" " 等方式划分)
-
str.split()
: 用于根据指定分隔符分割字符串,返回一个列表。split()
: 默认按空格分割。split(pat=" ")
: 按空格分割。split(pat=" ", n=1)
: 按空格分割,最多分割一次。
# 按空格分割 Risk 列 df['Risk_Parts'] = df['Risk'].str.split() # 按 "-" 分割,最多分割一次 df['Risk_First_Part'] = df['Risk'].str.split("-", n=1) # 提取First name # 从每行的分割后的list中按照list的index提取 customers['Name'].str.split(' ', n=1).str.get(0) # 通过get(index)获取list中指定index处的值 # 获取last name customers['Name'].str.split(' ', n=1).str.get(1) # 将 split 后的多个部分分别作为列 # 返回DataFrame customers['Name'].str.split(pat=' ', n=1, expand=True) # 如果没有控制 split 后得到的 list 的长度 # pandas 会自动取最长的len(list), 且缺失值处显示 None customers['Name'].str.split(pat=' ', expand=True)
11.给原来的DataFrame添加新列
# 把Name拆为1 、 2
customers[
['Name1','Name2']
] = customers['Name'].str.split(pat = ' ', n = 1, expand=True)
练习题
# customers.csv包括一个地址列。
# 每个地址由一条街道、城市、州和邮政编码组成。
# 分离这四个值;
# 将它们分配到DataFrame中新的Street、City、State和Zip列;
# 然后删除地址列。
customers
customers['Address'].values
split_Address = customers['Address'].str.split(', ', expand=True)
split_Address
customers[['Street', 'City', 'State', 'Zip']] = split_Address
customers = customers.drop(labels='Address', axis='columns')
customers
练习7
MultiIndex
MultiIndex(多级索引) 允许使用多个索引级别来组织数据,从而创建出层次化的数据结构。 这使得数据的分析和操作更加灵活和强大。
1. 创建
创建 MultiIndex 的方法有很多:
-
from_tuples
: 从元组列表创建 MultiIndex
import pandas as pd
tuples = [(1, 'a'), (1, 'b'), (2, 'a'), (2, 'b')]
index = pd.MultiIndex.from_tuples(tuples, names=['first', 'second'])
data = pd.DataFrame({'A': [1, 2, 3, 4]}, index=index)
print(data)
-
from_arrays
: 从数组列表创建 MultiIndex
arrays = [[1, 1, 2, 2], ['a', 'b', 'a', 'b']]
index = pd.MultiIndex.from_arrays(arrays, names=['first', 'second'])
data = pd.DataFrame({'A': [1, 2, 3, 4]}, index=index)
print(data)
-
from_product
: 从多个迭代器创建 MultiIndex
iterables = [[1, 2], ['a', 'b']]
index = pd.MultiIndex.from_product(iterables, names=['first', 'second'])
data = pd.DataFrame({'A': [1, 2, 3, 4]}, index=index)
print(data)
2. 访问数据
使用 MultiIndex 可以更方便地访问和操作数据:
-
loc
: 使用标签进行访问
# 获取 first 为 1,second 为 'a' 的数据
print(data.loc[(1, 'a')])
# 获取 first 为 1 的所有数据
print(data.loc[1])
# 获取 second 为 'a' 的所有数据
print(data.loc[:, 'a'])
-
iloc
: 使用位置进行访问
# 获取第一行数据
print(data.iloc[0])
# 获取前两行数据
print(data.iloc[:2])
-
xs
: 访问特定级别的值
# 获取 first 为 1 的所有数据
print(data.xs(1, level='first'))
# 获取 second 为 'a' 的所有数据
print(data.xs('a', level='second'))
3. 数据操作
MultiIndex 允许对数据进行更灵活的操作:
-
排序: 可以根据不同级别的索引进行排序
# 根据 first 级别升序排序
print(data.sort_index(level='first'))
# 根据 second 级别降序排序
print(data.sort_index(level='second', ascending=False))
-
分组: 可以根据不同级别的索引进行分组
# 根据 first 级别进行分组
grouped = data.groupby(level='first')
# 计算每个组的平均值
print(grouped.mean())
-
切片: 可以根据不同级别的索引进行切片
# 获取 first 级别为 1 的所有数据
sliced = data.loc[1]
# 获取 second 级别为 'a' 的所有数据
sliced = data.loc[:, 'a']
排序
查询
可以理解为数据降维
import pandas as pd
address = ('8890 Flair Square', 'Toddside', 'IL', '37206')
address
address = [
("8809 Flair Square", "Toddside", "IL", "37206"),
("9901 Austin Street", "Toddside", "IL", "37206"),
("905 Hogan Quarter", "Franklin", "IL", "37206"),
]
pd.MultiIndex.from_tuples(tuples=address)
# 给每个level取个名字
row_index = pd.MultiIndex.from_tuples(
tuples=address, names=['Street', 'City', 'State', 'Zip'])
row_index
# 使用MultiIndex创建DataFrame
# 对 DataFrame 的行使用 MultiIndex
data = [
['A', 'B+'],
['C+', 'C'],
['D-', 'A']
]
columns = ['Schools' ,'Cost of Living']
area_grades = pd.DataFrame(
data=data, index=row_index, columns=columns
)
area_grades
area_grades.columns
area_grades.index
# 对 DataFrame 的列使用 MultiIndex
column_index = pd.MultiIndex.from_tuples(
[
("Culture", "Restaurants"),
("Culture", "Museums"),
("Services", "Police"),
("Services", "Schools"),
]
)
column_index