zoukankan      html  css  js  c++  java
  • Python中关于列表嵌套列表的处理

    在处理列表的时候我们经常会遇到列表中嵌套列表的结构,如果我们要把所有元素放入一个新列表,或者要计算所有元素的个数的话应该怎么做呢?

    第一个例子

    IMDB-Movie-Data

    对于上图中的这样一组数据,如果我们要知道这个CSV文件中所有演员的数量(同一个人只能出现一次)应该怎么做呢?

    在pandas中我们可以先取Actors这一列,但是取出来之后我们会发现这是一个列表中嵌套列表的结构,要想将所有元素提取出来我们可以使用两个for循环来解决这一问题。代码如下:

    # encoding = utf-8
    
    import pandas as pd
    
    file_path = "d:/learning/pandas/IMDB-Movie-Data.csv"
    
    df = pd.read_csv(file_path)
    
    print(df.head(1))
    
    # 读平均评分
    print(df["Rating"].mean())
    
    # 导演的人数(下面两个操作达到的效果是一样的)
    print(len(set(df["Director"].tolist())))
    print(len(df["Director"].unique()))
    
    # 获取演员的人数
    temp_list = df["Actors"].str.split(", ").tolist()
    
    # 将列表套列表转为单列表
    actors_list = [i for j in temp_list for i in j]
    
    # set函数是对列表作集合操作,可以去重
    print(len(set(actors_list)))
    
    

    第二个例子

    我们再来看第二组例子,还是上图中的数据,如果我们想要统计各个分类的电影的数量,应该怎么做呢?核心思想是:

    1. 先处理列表嵌套列表,将所有的分类统计出来;
    2. 建立一个值全为0的数组,这个数组的行数等于电影数,列数等于分类数;
    3. 在这个数组的列方向上进行求和,得出结果。
    # coding=utf-8
    
    import pandas as pd
    import numpy as np
    from matplotlib import pyplot as plt
    
    file_path = "~/桌面/IMDB-Movie-Data.csv"
    df = pd.read_csv(file_path)
    
    # 新建临时列表,将数组中分类列读取
    temp_list =  df["Genre"].str.split(",").tolist()
    # 处理列表嵌套列表的结构,去除重复元素
    Genre_list = set([i for j in temp_list for i in j])
    
    # 新建一个统计数组,即上文所说的第二步
    a = pd.DataFrame(np.zeros((df.shape[0], len(Genre_list))), columns=Genre_list, dtype=int)
    
    # 赋值,将上述列表中对应的位置的值变为1
    for i in range(len(temp_list)):
        a.loc[i, temp_list[i]] = 1
    
    # 求和,统计每个分类的电影的数量
    sum = a.sum(axis=0)
    sum = sum.sort_values(ascending=False)
    
    # 绘制条形统计图
    _x = sum.index
    _y = sum.values
    
    plt.figure(figsize=(20, 8), dpi=80)
    plt.yticks(range(max(sum.values)+50)[::50])
    
    plt.bar(_x, _y)
    plt.show()
    
    

    结果如图:

    电影分类情况统计图

    这里有一个重要的问题,如果原始数据的行数特别多,再采用for循环进行行遍历就会耗费特别长的时间

    解决办法见这里的第三个例子。

  • 相关阅读:
    Zabbix,Nagios,OneAPM Servers 安装部署大比拼
    Android 手把手带你玩转自己定义相机
    Sublime Text3 快捷键
    超具体Windows版本号编译执行React Native官方实例UIExplorer项目(多图慎入)
    poj 1664 放苹果(递推)
    在HyperLedger Fabric中启用CouchDB作为State Database
    HyperLedger Fabric 1.0的Transaction处理流程
    如何将Bitcoin比特币区块链数据导入关系数据库
    在Ubuntu中部署并测试Fabric 1.0 Beta
    在Ubuntu上快速搭建基于Beego的RESTful API
  • 原文地址:https://www.cnblogs.com/dereen/p/list_in_list.html
Copyright © 2011-2022 走看看