Pandas 100道练习题(四)
今天是100道练习题的第四天,也是练习题第一阶段的最后一篇,然后我们学习学习其他知识(换换口味),有时间再对后面的练习题做进一步的讲解。
Cleaning Data
难度:简单/中等
有如下数据
# 数据
df = pd.DataFrame({'From_To': ['LoNDon_paris', 'MAdrid_miLAN', 'londON_StockhOlm',
'Budapest_PaRis', 'Brussels_londOn'],
'FlightNumber': [10045, np.nan, 10065, np.nan, 10085],
'RecentDelays': [[23, 47], [], [24, 43, 87], [13], [67, 32]],
'Airline': ['KLM(!)', '<Air France> (12)', '(British Airways. )',
'12. Air France', '"Swiss Air"']})
38-1.png
- 请根据要求填充缺失值
FlightNumber 列中的某些值丢失(它们是NaN)。这些数字每行增加10,因此需要放置10055和10075。 修改df以填充这些缺失的数字,并使该列成为整数列(而不是float列)。
# 答案
# 使用 interpolate 函数对 FlightNumber 列进行插值操作
# 该函数在文章【Series第五讲 缺失值处理】中有讲解
df['FlightNumber']=df['FlightNumber'].interpolate().astype(int)
38-2.png
- From_To 列最好是两个单独的列,根据下划线进行分割。生成一个临时的DataFrame(变量名为 temp)。 将正确的列名 From 和 To 分配给 temp
temp = df['From_To'].str.split('_', expand=True)
temp.columns = ['From', 'To']
39.png
- 在 temp 中城市名大小写混乱,现在统一改成首字母大写,其他字母小写的格式
temp['From'] = temp['From'].str.capitalize()
temp['To'] = temp['To'].str.capitalize()
40.png
- 从 df 中删除 From_To 列,并将 temp 合并到df 中
df.drop('From_To', axis=1, inplace=True)
df.join(temp)
41.png
- 清除 Airline 列的特殊符号,仅保留航空公司名称
# extract 字符串提取
df['Airline'] = df['Airline'].str.extract(r'([a-zA-Z\s]+)', expand=False).str.strip()
- 将 delays 列转换为 delay_1, delay_2 列等
delays = df['RecentDelays'].apply(pd.Series)
delays.columns = ['delay_%s' % i for i in range(1, len(delays.columns)+1)]
df.drop('RecentDelays', axis=1).join(delays)
43.png
Using MultiIndexes
难度:简单/中等
- 给定 letters=['A', 'B', 'C'] 和 numbers=list(range(10)),用这两个列表构造一个MultiIndex对象,用它来索引一系列随机数
letters = ['A', 'B', 'C']
numbers = list(range(10))
index = pd.MultiIndex.from_product([letters, numbers])
s = pd.Series(data=np.random.rand(len(index)), index=index)
44.png
- 检查s的索引是按 lexsorted
s.index.is_lexsorted()
- 选择第二层索引为1,3,6的数据
s.loc[:,[1,3,6]]
- 切片Series,从第一个级别的标签“B”开始切片,从第二个级别的标签5开始进行切片
s.loc[pd.IndexSlice[:'B', 5:]]
47.png
- 对第一层索引进行求和
s.sum(level=0)
48.png
- 对第二层索引进行求和,不许使用 level 参数
s.unstack().sum()
49.png
- 交换 MultiIndexes 两个索引的层级,并对结果进行 lexsorted 排序
s.swaplevel().sort_index()
50.png
一年三百六十日,多是横戈马上行