对于这种“宽”数据,在展示方面来说没有什么问题,但是数据分析的时候我们需要“长”数据,这时候就需要整理数据整理成我们想要的样子。
melt( )函数
把字段拆分成数据
- id_vars参数:保留哪个字段(
可以保留多个字段
) - var_name参数:为其余转换的字段起别名
- value_name参数:为值的那一列起别名
pew_long = pd.melt(pew,id_vars='religion',var_name='income',value_name='count')
print(pew_long)
保留多个列
# 保留除了冗余的字段外其他的字段
bill_long = bill_board.melt(id_vars=['year','artist','track','time','date.entered'],var_name="周期",value_name="周排行")
drop_duplicates( )函数
根据列名删除重复数据
根据歌手查看数据发现很多同一首歌相同的数据,这时候需要去除冗余数据:
bill_long.drop_duplicates(subset=['year','artist','track','time','date.entered'],keep='first',inplace=True)
subset
参数:要进行去重的列名,默认Nonekeep
可选参数:first
保留第一次出现重复行,删除后面的重复last
删除重复项,保留最后一个重复的数据False
删除所有重复的数据
inplace
参数: 布尔值,默认False,为True时直接修改原数据,False时修改完的数据返回一个副本
stack( )函数
原数据:
stack()方法整理数据
state_fruit_tidy = state_fruit.stack()
重置索引转换为DataFrame对象并修改列索引:
state_fruit_tidy = state_fruit.stack().reset_index()
state_fruit_tidy.columns = ['state', 'fruit', 'weight']
wide_to_long( )函数
原数据:
- 从上面数据中可以看出,列名中包含了数字 1,2,3 如果想把这部分信息提取到列当中,可以使用wide_to_long函数
使用wide_to_long函数时,要求 1,2,3 这样的顺序信息在列名的最后,并用分隔符隔开
-
使用自定义函数先整理数据为wide_to_lang()需要的数据格式:
wide_to_lang()函数需要数据格式 列名\分隔符\数字
#创建一个自定义函数,用来改变列名。将数字放到列名的最后 def change_col_name(col_name): # 每一次传入列表 把_name替换为空 前三个数据符合格式 col_name = col_name.replace('_name', '') if 'facebook' in col_name: # 处理后三个列名 fb_idx = col_name.find('facebook') col_name = col_name[:5] + col_name[fb_idx - 1:] + col_name[5:fb_idx-1] return col_name actor2 = actor.rename(columns=change_col_name) actor2.head()
- 使用wide_to_lang()函数
stubnames
参数:提取以指定字符串开头的列(可传入字符串和列表
)i
参数:当作索引的列(可传入字符串和列表
)j
参数: 提取开头后剩余的部分,在此指定列名(传入字符串
)sep
参数: 指定分隔符 ,默认" "
(传入字符串
)
# 列名列表
stubs = ['actor', 'actor_facebook_likes']
actor2_tidy = pd.wide_to_long(actor2,
stubnames=stubs,
i=['movie_title'],
j='actor_num',
sep='_').reset_index()
print(actor2_tidy)
小结
方法 | 特点 |
---|---|
melt | 指定数据列,将指定的列变成长数据 |
stack | 返回一个具有多层级索引的数据,配合reset_index()重置索引可实现宽数据 变成长数据 |
wide_to_lang | 处理列名带数字后缀的宽数据 |
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)