Day 33 :字符串离散化

首页 » 数据科学库 » 正文

2020/11/7

把整合在一起的数据分开(字符串离散)

例如 每一部电影类型里 有 “喜剧,动作,爱情,剧情” 等不同的用逗号隔开的标签。所以想要知道 包含喜剧的片子有多少部的话,就得把这些标签分开。
思路
把字符串转化成数据进行统计,相当于把字符串离散化成为数据。
先构造一个全为0的列表,把出现过的字符串为转化为1,然后再统计1出现的次数
Day 33 :字符串离散化

import pandas as pd
from matplotlib import pyplot as plt
import numpy as np

df = pd.read_csv(file_path)
print(df["Genre"].head(3))
#统计分类的列表
temp_list = df["Genre"].str.split(",").tolist()  #[[],[],[]]列表嵌套列表 把每一行铺开为一个大列表
print(temp_list)
"""
[['Action', 'Adventure', 'Sci-Fi'] ...['Horror', 'Thriller'], ['Animation', 'Comedy', 'Family'], ['Action', 'Adventure', 'Fantasy']]
"""
genre_list = list(set([i for j in temp_list for i in j]))  #把列表里的字符串去重
print(genre_list)
"""
['War', 'Crime', 'Comedy', 'Romance', 'Thriller', 'History', 'Mystery', 'Western', 'Sport', 'Sci-Fi', 'Horror', 'Fantasy', 'Family', 'Musical', 'Music', 'Animation', 'Biography', 'Drama', 'Action', 'Adventure']
"""

#构造全为0的数组 : np.zero方法建立为0 的数组,行数就是df 的行数,列数就是去重后列表的列数,然后列的title 为去重后的列表
zeros_df = pd.DataFrame(np.zeros((df.shape[0],len(genre_list)),columns=genre_list) 
print(zeros_df)
"""
     War  Crime  Comedy  Romance  ...  Biography  Drama  Action  Adventure
0    0.0    0.0     0.0      0.0  ...        0.0    0.0     0.0        0.0
1    0.0    0.0     0.0      0.0  ...        0.0    0.0     0.0        0.0
2    0.0    0.0     0.0      0.0  ...        0.0    0.0     0.0        0.0
3    0.0    0.0     0.0      0.0  ...        0.0    0.0     0.0        0.0
4    0.0    0.0     0.0      0.0  ...        0.0    0.0     0.0        0.0
..   ...    ...     ...      ...  ...        ...    ...     ...        ...
995  0.0    0.0     0.0      0.0  ...        0.0    0.0     0.0        0.0
996  0.0    0.0     0.0      0.0  ...        0.0    0.0     0.0        0.0
997  0.0    0.0     0.0      0.0  ...        0.0    0.0     0.0        0.0
998  0.0    0.0     0.0      0.0  ...        0.0    0.0     0.0        0.0
999  0.0    0.0     0.0      0.0  ...        0.0    0.0     0.0        0.0
"""

#给每个电影出现分类的位置赋值1
# 遍历初始列表, i的取值范围就是初始列表的行数  ,而且这个行数正好是铺开的大列表里面元素的个数
for i in range(df.shape[0]):
    #直接用loc方法定位改为1   下面那一行就是 = zeros_df.loc[0,["Sci-fi","Mucical"]] = 1
    zeros_df.loc[i,temp_list[i]] = 1
print(zeros_df.head(3))
"""
   War  Crime  Comedy  Romance  ...  Biography  Drama  Action  Adventure
0  0.0    0.0     0.0      0.0  ...        0.0    0.0     1.0        1.0
1  0.0    0.0     0.0      0.0  ...        0.0    0.0     0.0        1.0
2  0.0    0.0     0.0      0.0  ...        0.0    0.0     0.0        0.0
"""

#统计每个分类的电影的数量和,因为其他数据都为0 ,所以使用sum方法就是把每个列方向上的和求出来了
genre_count = zeros_df.sum(axis=0)
print(genre_count)
"""
War           13.0
Crime        150.0
Comedy       279.0
Romance      141.0
Thriller     195.0
History       29.0
Mystery      106.0
Western        7.0
Sport         18.0
Sci-Fi       120.0
Horror       119.0
Fantasy      101.0
Family        51.0
Musical        5.0
Music         16.0
Animation     49.0
Biography     81.0
Drama        513.0
Action       303.0
Adventure    259.0
"""
#排序
genre_count = genre_count.sort_values()
_x = genre_count.index		#上面可以看见,genre_count 是一个series 类型,所以直接用index方法 让索引为_x
_y = genre_count.values		#用values 让数值为_y
#画图
plt.figure(figsize=(20,8),dpi=80)
plt.bar(range(len(_x)),_y,width=0.4,color="orange")	#因为数据之间没有联系,所以用条形图
plt.xticks(range(len(_x)),_x)						#设置横坐标每个点的title
plt.show()

画图的结果是
Day 33 :字符串离散化

未经允许不得转载:作者:1249-刘同学, 转载或复制请以 超链接形式 并注明出处 拜师资源博客
原文地址:《Day 33 :字符串离散化》 发布于2020-11-08

分享到:
赞(0) 打赏

评论 抢沙发

评论前必须登录!

  注册



长按图片转发给朋友

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

微信扫一扫打赏

Vieu3.3主题
专业打造轻量级个人企业风格博客主题!专注于前端开发,全站响应式布局自适应模板。

登录

忘记密码 ?

您也可以使用第三方帐号快捷登录

Q Q 登 录
微 博 登 录