参考资料:活用pandas库
1、行与列中的变量
当变量同时出现在行和列中,必须将变量转换为单独的列。操作案例如下:
import pandas as pd
weather=pd.read_csv(r"...\data\weather.csv")
# 展示原始数据
print(weather.iloc[:5,:11])
对于此数据集,element列包含的变量需要转换才能成为新列,而day变量需要“融合”成行值。强调一下,当前数据格式没有任何问题。这种格式在报表呈现数据时很合适,但不利于分析。首先要对day进行融合/逆透视(melt函数)。然后再调整element列中存储的变量(pivot_table方法)。pivot_table和melt的主要区别是:melt是pandas中的函数,而pivot_table是dataframe对象的方法。
数据整理代码如下:
# 对day值进行逆透视操作
weather_melt=pd.melt(weather,id_vars=['id','year','month','element'],
var_name='day',
value_name='temp')
# 对element进行透视操作
weather_tidy=weather_melt.pivot_table(
index=['id','year','month','day'],
columns='element',
values='temp')
# 重置行索引
weather_tidy_flat=weather_tidy.reset_index()
# 展示整理后的数据集
print(weather_tidy_flat.head())
2、一张表中的多个观测单元(归一化)
了解一张表中是否有多个观测单元,最简单的方法就是查看每一行,并记录行间重复的所有单元或值。
# 读取数据集
billboard=pd.read_csv(r"...\data\billboard.csv")
# 将数据集转换为长数据
billboard_long=pd.melt(billboard,
id_vars=['year','artist','track','time','date.entered'],
var_name='week',
value_name='rating')
# 展示数据
billboard_long.head()
billboard_long[billboard_long.track=='Loser'].head()
由上图可知,该表包含了两类数据,歌曲信息和周排行。最好把歌曲信息存储在单独的表中,如此year、artist、track和time等列的信息就不会在数据集中重复出现。具体操作为:把year、artist、track、time和date.entered放入一个新的dataframe中,给每组值分配唯一的ID,然后再另一个DataFrame(表示歌曲、日期、周次及排名)中使用这些ID。代码如下:
# 将歌曲信息列单独取出
billboard_songs=billboard_long[['year','artist','track','time']]
# 删除重复行
billboard_songs=billboard_songs.drop_duplicates()
# 为每行数据分配唯一的值
billboard_songs['id']=range(len(billboard_songs))
# 展示得到的单独的歌曲信息的DataFrame
print(billboard_songs.head())
# 把歌曲DataFrame合并到原来的数据集中
billboard_ratings=billboard_long.merge(
billboard_songs,
on=['year','artist','track','time'])
# 把原来的'year','artist','track','time'列剔除
billboard_ratings=billboard_ratings[['id','date.entered','week','rating']]
# 展示用id代替歌曲信息的表
print(billboard_ratings.head())