• 数据分析9


    目录

    字符串离散化:

     数据合并

    按照行索引合并join

    按照列索引合并merge

    内连接

     

     外连接,左连接,右连接


    字符串离散化

    对于这一组电影数据,如果我们希望统计电影分类(genre)的情况,应该如何处理数据?

    思路:重新构造一个全为0的数组,列名为分类,如果某一条数据中分类出现过,就让0变为1

    1. import pandas as pd
    2. import numpy as np
    3. file_path = "./IMDB-Movie-Data.csv"
    4. df = pd.read_csv(file_path,delimiter=",")
    5. #将电影分类这一列取出来
    6. df1 = df["Genre"]
    7. print(df1)
    8. print("*"*100)
    9. #将每个电影类型转换成列表形式
    10. temp_list = df["Genre"].str.split(",").tolist()
    11. print(temp_list)

     

    对电影类型去重

    1. genre_list = list(set([j for i in temp_list for j in i]))#去重
    2. print(genre_list)


    构造全为0,行数为电影个数,列数为电影类型个数的DataFrame

    1. #构造全为0的数组(np.zeros(行数,列数))
    2. df_0 = pd.DataFrame(np.zeros((df.shape[0],len(genre_list))),columns=genre_list)
    3. print(df_0)


     出现类型的电影修改为1

    1. #给每个电影出现类型的位置将0修改为1(df.shape[0]表示电影总数)
    2. for i in range(df.shape[0]):
    3. #     for j in temp_list[i]:
    4. #         df_0.loc[i,j]=1
    5. #注释掉的两行等价于
    6.     #即取一行多列,df_0[i,[" Romance"," War","Horror"]]
    7.     df_0.loc[i,temp_list[i]]=1
    8. print(df_0)


    本剧电影类型统计电影数

    1. #统计每个分类的电影的数量和
    2. genre_sum = df_0.sum(axis=0)#行方向上的统计求和
    3. print(genre_sum)

    按照统计结果排序

    1. #排序
    2. genre_count = genre_count.sort_values(ascending=False)
    3. print(genre_count)


    绘制条形图

    1. 绘制条形图
    2. plt.figure(figsize=(20,8),dpi=80)
    3. _x = genre_count.index
    4. _y = genre_count.values
    5. plt.barh(range(len(_x)),_y)
    6. plt.yticks(range(len(_x)),_x)
    7. plt.show()

    完整代码 

    1. import pandas as pd
    2. import numpy as np
    3. from matplotlib import pyplot as plt
    4.  
    5.  
    6. file_path = "./IMDB-Movie-Data.csv"
    7. df = pd.read_csv(file_path,delimiter=",")
    8.  
    9. #将电影分类这一列取出来
    10. df1 = df["Genre"]
    11.  
    12. #将每个电影类型转换成列表形式
    13. temp_list = df["Genre"].str.split(",").tolist()
    14. genre_list = list(set([j for i in temp_list for j in i]))#去重
    15.  
    16. #构造全为0的数组(np.zeros(行数,列数))
    17. df_0 = pd.DataFrame(np.zeros((df.shape[0],len(genre_list))),columns=genre_list)
    18.  
    19. #给每个电影出现类型的位置将0修改为1(df.shape[0]表示电影总数)
    20. for i in range(df.shape[0]):
    21. #     for j in temp_list[i]:
    22. #         df_0.loc[i,j]=1
    23. #注释掉的两行等价于
    24.     #即取一行多列,df_0[i,[" Romance"," War","Horror"]]
    25.     df_0.loc[i,temp_list[i]]=1
    26.  
    27. #统计每个分类的电影的数量和
    28. genre_count = df_0.sum(axis=0)#行方向上的统计求和
    29.  
    30. #排序
    31. genre_count = genre_count.sort_values()
    32.  
    33. #绘制条形图
    34. plt.figure(figsize=(20,8),dpi=80)
    35. _x = genre_count.index
    36. _y = genre_count.values
    37. plt.barh(range(len(_x)),_y)
    38. plt.yticks(range(len(_x)),_x)
    39. plt.show()
    40.  

     数据合并

    按照行索引合并join

    join:默认情况下他是把行索引相同的数据合并到一起,

    1. import pandas as pd
    2. import numpy as np
    3. from matplotlib import pyplot as plt
    4.  
    5. #index表示的是列标签,columns表示的是行标签
    6. df1 = pd.DataFrame(np.ones((2,4)),index=["A","B"],columns=list("abcd"))
    7. print(df1)
    8. df2 = pd.DataFrame(np.ones((3,3)),index=["A","B","C"],columns=list("xyz"))
    9. print(df2)
    10. print("*"*100)
    11.  
    12. #用.join将两个表连接起来
    13. print("df1.join(df2)")
    14. print(df1.join(df2))
    15. print("df2.join(df1)")
    16. print(df2.join(df1))

     

    显然,df1.join(df2)的话总是以df1的index为总体的index,在df1的基础上加上df2

    按照列索引合并merge

    merge:按照指定的列把数据按照一定的方式合并到一起,

    内连接

    1. import pandas as pd
    2. import numpy as np
    3. from matplotlib import pyplot as plt
    4.  
    5. #index表示的是列标签,columns表示的是行标签
    6. df1 = pd.DataFrame(np.ones(((3,3))),index=["A","B","C"],columns=list("nmx"))
    7. print("df1",df1)
    8. df2 = pd.DataFrame(np.ones((3,3)),index=["A","B","C"],columns=list("xyz"))
    9. print("df2",df2)
    10. df3 = pd.DataFrame(np.zeros(((3,3))),index=["A","B","C"],columns=list("nmx"))
    11. df3.loc["A","x"]=1
    12. print("df3",df3)
    13. print("*"*100)
    14.  
    15. #merge内连接(交集∩)默认情况下merge做得是内连接
    16. print("内连接","两个df在x列有一样数值","df1.merge(df2,on=x)")
    17. print(df1.merge(df2,on="x"))#on表示按照哪一列连接
    18. print("内连接","两个df在x列存在不一样的数值","df1.merge(df3,on=x)")
    19. print(df1.merge(df3,on="x"))

     

     

     外连接,左连接,右连接

    1. import pandas as pd
    2. import numpy as np
    3. from matplotlib import pyplot as plt
    4.  
    5. #index表示的是列标签,columns表示的是行标签
    6. df1 = pd.DataFrame(np.ones(((3,3))),index=["A","B","D"],columns=list("nmx"))
    7. print("df1",df1)
    8. df2 = pd.DataFrame(np.zeros((3,3)),index=["A","K","C"],columns=list("xyz"))
    9. print("df2",df2)
    10. df3 = pd.DataFrame(np.zeros(((3,3))),index=["A","B","C"],columns=list("nmx"))
    11. df3.loc["A","x"]=1
    12. print("df3",df3)
    13. print("*"*100)
    14.  
    15. #外连接需要参数how="outer",内连接时,how="inner"(默认)外连接取并集∪
    16. print(df1.merge(df2,on="x",how="outer"))
    17. #一个表中有,另一个表没有,且两个表数值不完全一样,用NaN表示
    18.  
    19. #左连接,列根据df1的列来,即左边为准NaN补全
    20. print("左连接")
    21. print(df1.merge(df2,on="x",how="left"))
    22. #右连接,列根据df2的列来,即右边为准NaN补全
    23. print("右连接")
    24. print(df1.merge(df2,on="x",how="right"))

     

  • 相关阅读:
    算法训练(leetcode)第二十八天 | 509. 斐波那契数、70. 爬楼梯、746. 使用最小花费爬楼梯
    【Windows 11】安装 Android子系统 和 Linux子系统
    PB转纯BS工具
    数据公网传输加密隧道技术
    HiQPdf Library for .NET - HTML to PDF Crack
    「智头条」智能家居企业扎堆IPO:欧瑞博重启IPO,凯迪仕、立林启动IPO;魅族新专利可无感匹配智能家居
    论文学习——降雨场次划分方法对降雨控制率的影响分析
    数据结构--双链表
    100行代码教你写个卡牌翻翻乐小游戏
    如何使用ChatGPT来辅助写简历
  • 原文地址:https://blog.csdn.net/qq_62262691/article/details/126454805