Pandas 100道练习题(四)

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
  1. 请根据要求填充缺失值

FlightNumber 列中的某些值丢失(它们是NaN)。这些数字每行增加10,因此需要放置1005510075。 修改df以填充这些缺失的数字,并使该列成为整数列(而不是float列)。

# 答案
# 使用 interpolate 函数对 FlightNumber 列进行插值操作 
# 该函数在文章【Series第五讲 缺失值处理】中有讲解
df['FlightNumber']=df['FlightNumber'].interpolate().astype(int)
38-2.png
  1. From_To 列最好是两个单独的列,根据下划线进行分割。生成一个临时的DataFrame(变量名为 temp)。 将正确的列名 FromTo 分配给 temp
temp = df['From_To'].str.split('_', expand=True)
temp.columns = ['From', 'To']
39.png
  1. temp 中城市名大小写混乱,现在统一改成首字母大写,其他字母小写的格式
temp['From'] = temp['From'].str.capitalize()
temp['To'] = temp['To'].str.capitalize()
40.png
  1. df 中删除 From_To 列,并将 temp 合并到df
df.drop('From_To', axis=1, inplace=True)
df.join(temp)
41.png
  1. 清除 Airline 列的特殊符号,仅保留航空公司名称
# extract 字符串提取
df['Airline'] = df['Airline'].str.extract(r'([a-zA-Z\s]+)', expand=False).str.strip()
  1. 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

难度:简单/中等

  1. 给定 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
  1. 检查s的索引是按 lexsorted
s.index.is_lexsorted()
  1. 选择第二层索引为1,3,6的数据
s.loc[:,[1,3,6]]
  1. 切片Series,从第一个级别的标签“B”开始切片,从第二个级别的标签5开始进行切片
s.loc[pd.IndexSlice[:'B', 5:]]
47.png
  1. 对第一层索引进行求和
s.sum(level=0)
48.png
  1. 对第二层索引进行求和,不许使用 level 参数
s.unstack().sum()
49.png
  1. 交换 MultiIndexes 两个索引的层级,并对结果进行 lexsorted 排序
s.swaplevel().sort_index()
50.png

一年三百六十日,多是横戈马上行

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。