Python学习从0开始——Kaggle实践可视化001

news2024/11/19 0:30:28

Python学习从0开始——Kaggle实践可视化001

  • 一、创建和加载数据集
  • 二、数据预处理
    • 1.按name检查,处理重复值(查重)
    • 2.查看存在缺失值的列并处理(缺失值处理)
      • 2.1按行或列查看
      • 2.2无法推测的数据
      • 2.3可由其它列推测的数据
    • 3.拆列,获取元数据

使用数据集:“Top Ranked Anime Dataset 2024”,文件名称是:toprankedanime.csv

一、创建和加载数据集

登录kaggle选择创建新笔记本:

在这里插入图片描述

然后删掉默认代码,加载数据集:

import numpy as np 
import pandas as pd
# 路径
anime_file_path = '/kaggle/input/top-ranked-anime-dataset/toprankedanime.csv'
# 读取
anime_data = pd.read_csv(anime_file_path) 
# 总览数据,查看基本信息
#anime_data.describe()
#anime_data.head
#anime_data.columns
#anime_data.head(3)
nametypeepisodesstatusairedpremieredbroadcastproducerslicensorsstudiossourcegenresdurationratingscorerankedpopularityfavorites
Sousou no FrierenTV28Finished AiringSep 29, 2023 to Mar 22, 2024Fall 2023Fridays at 23:00 (JST)[‘Aniplex’, ‘Dentsu’, ……][‘add some’]MadhouseManga[‘Adventure’, ‘Drama’, ‘Fantasy’]24 min. per ep.PG-13 - Teens 13 or older9.36#1#25943,524
Steins;GateTV24Finished AiringApr 6, 2011 to Sep 14, 2011Spring 2011Wednesdays at 02:05 (JST)[‘Frontier Works’, ‘Media Factory’……][‘Funimation’]White Fox[‘Drama’, ‘Sci-Fi’, ‘Suspense’]24 min. per ep.PG-13 - Teens 13 or older9.07#3#13189,803
Fullmetal Alchemist: BrotherhoodTV64Finished AiringApr 5, 2009 to Jul 4, 2010Spring 2009Sundays at 17:00 (JST)[‘Aniplex’, ‘Square Enix’……][‘Funimation’, ‘Aniplex of America’]BonesManga[‘Action’, ‘Adventure’, ‘Drama’, ‘Fantasy’]24 min. per ep.R - 17+ (violence & profanity)9.09#2#3226,283

columns:Index([‘name’, ‘type’, ‘episodes’, ‘status’, ‘aired’, ‘premiered’, ‘broadcast’,
‘producers’, ‘licensors’, ‘studios’, ‘source’, ‘genres’, ‘duration’,
‘rating’, ‘score’, ‘ranked’, ‘popularity’, ‘favorites’],
dtype=‘object’)
#动漫名称:动漫的标题。
#类型:动漫分类(例如,电视、电影、OVA)。
#集数:集数。
#状态:广播状态(例如,“已完成播出”)。
#在电视台或在线平台上正式播出的时间
#播出日期:原播出日期。
#首映:首映的季节和年份。
#广播:每周广播时间。
#生产者:参与生产的公司。
#许可方:负责在不同地区授权动漫的公司。
#工作室:为该系列制作动画的工作室。
#来源:原始资料(例如,漫画、轻小说)。
#类型:描述节目的类别(例如,动作、剧情)。
#持续时间:每集的长度。
#等级:观众适宜性
#分数: MyAnimeList 用户给出的平均评分。
#排名:在MyAnimeList上排名。
#人气:在MyAnimeList上的人气排名。
#收藏夹:用户收藏的次数。

二、数据预处理

1.按name检查,处理重复值(查重)

使用Pandas库的duplicated方法。这个方法会返回一个布尔序列,指示哪些行在指定列(或所有列)中是重复的。

# 首先按name检查是否有重复值

duplicated_names = anime_data['name'].duplicated()  
# 查看所有重复的名称  
duplicate_names_list = anime_data[duplicated_names]['name'].unique().tolist()   
# 输出重复的名称(如果有的话)  
if len(duplicate_names_list) > 0:  
    print("存在重复的名称:")  
    print(duplicate_names_list)  
else:  
    print("name列中没有重复值。")  

如果有重复行,那么需要额外的处理,以下是一些常见的处理重复值的方法:

  1. 删除重复行
    如果你确定重复的行是多余的,并且你想要保留唯一的记录,你可以删除这些重复的行。在Pandas中,你可以使用drop_duplicates方法来实现这一点。

    anime_data = anime_data.drop_duplicates(subset='name', keep='first')  # keep='first'保留第一次出现的行
    # 或者
    # anime_data = anime_data.drop_duplicates(subset='name', keep='last')  # keep='last'保留最后一次出现的行
    # 或者
    # anime_data = anime_data.drop_duplicates(subset='name', keep=False)  # keep=False删除所有重复的行
    
  2. 合并重复行
    如果重复的行包含了一些不同的信息,你可能想要合并这些行。这通常涉及到聚合操作,例如计算重复行的某个字段的平均值、总和等。

    # 假设你有一个想要聚合的字段'score'
    anime_data_agg = anime_data.groupby('name').agg({'score': 'mean'}).reset_index()  # 计算每个动漫的平均评分
    
  3. 标记重复行
    如果你想要保留重复的行,但同时想要知道哪些行是重复的,你可以使用duplicated方法(如之前所示)来创建一个新的布尔列来标记这些行。

    anime_data['is_duplicate'] = anime_data.duplicated(subset='name')
    
  4. 手动处理
    在某些情况下,你可能需要手动检查重复的行,并根据具体情况决定如何处理它们。例如,你可能需要查看除了’name’列之外的其他列来确定是否应该合并或删除这些行。

  5. 错误检查
    重复的值有时可能表示数据输入或处理过程中的错误。在这种情况下,你可能需要回到数据源,检查为什么会有重复的行,并修正错误。

  6. 保持备份
    在对数据进行任何修改之前,最好先备份原始数据。这样,如果后续需要回到原始状态或重新处理数据,你可以很容易地做到这一点。

根据你的具体需求和数据集的特性,选择最适合你的方法来处理重复值。

2.查看存在缺失值的列并处理(缺失值处理)

要查看Pandas DataFrame中哪些列存在缺失值(通常表示为NaN),可以使用isnull()方法结合any()或sum()方法。

2.1按行或列查看

#按列查看
# 查看哪些列包含缺失值  
columns_with_missing = anime_data.columns[anime_data.isnull().any()].tolist()  
print("包含缺失值的列:", columns_with_missing)
# 包含缺失值的列: ['premiered', 'broadcast', 'source', 'rating']即首映,播放,来源,等级

# 查看每一列中缺失值的数量  
missing_counts = anime_data.isnull().sum()  
#print("每一列中缺失值的数量:")  
#print(missing_counts)

# 只查看包含缺失值的列及其缺失值的数量  
columns_with_missing_and_counts = anime_data.columns[anime_data.isnull().any()].tolist()  
missing_counts_filtered = anime_data[columns_with_missing_and_counts].isnull().sum()  
print("包含缺失值的列及其缺失值的数量:")  
print(missing_counts_filtered)
#包含缺失值的列及其缺失值的数量:
#premiered    988
#broadcast    988
#source       658
#rating         1
#dtype: int64
# 按行查看
# 使用 any(axis=1) 来检查每一行是否至少有一个缺失值  
rows_with_missing = anime_data[anime_data.isnull().any(axis=1)]  
  
# 显示这些行  
#print(rows_with_missing)

# 只显示该行的缺失列数据
#print(rows_with_missing.name,rows_with_missing[columns_with_missing])

# 打印缺失列
#for index, row in rows_with_missing.iterrows():  
#    print(f"在索引 {index} 的行中,缺失值的列有:")  
#    for column in row.index[row.isnull()]:  
#        print(column)  
#    print("\n")  # 打印一个空行分隔不同行的输出

2.2无法推测的数据

#处理缺失数据

#不修改原数据集,创建一个新的数据集修改
anime_data_filled = anime_data.copy()  

#处理rating
#找到rating为null的数据
#ratingNull=rows_with_missing[rows_with_missing['rating'].isnull()]
#selected_columns = ['name', 'rating', 'score']  
#print(ratingNull[selected_columns])
#输出:
#                              name rating  score
#1762  Xue Ying Ling Zhu 2nd Season    NaN   7.48
#rating列的缺失值被替换为'unknown'
anime_data_filled['rating'].fillna('unknown')

#处理其他列
#source和broadcast列的缺失值被替换为'unknown'
anime_data_filled['source'].fillna('unknown')
anime_data_filled['broadcast'].fillna('unknown')

2.3可由其它列推测的数据

如:aired值为Apr 1, 2007 to Sep 30, 2007,那么premiered就是Spring 2007

#处理premiered首映列控制问题
#premired列可以由aired列推出
#不推荐将premired值直接设为aired值,因为之后要用到日期分析
#anime_data_filled['premiered'] = anime_data_filled['premiered'].combine_first(anime_data_filled['aired'])  

# 推荐
import re  
from datetime import datetime  
  
def infer_premiered_season(aired_date):  
    # 首先尝试匹配包含开始和结束日期的格式:Oct 4, 2006 to Jun 27, 2007
    match = re.match(r'(\w+ \d+, \d+) to (\w+ \d+, \d+)', aired_date)  
    if match:  
        start_date_str, end_date_str = match.groups()  
        # 使用开始日期来确定季度  
        start_date = datetime.strptime(start_date_str, '%b %d, %Y')  
        season = get_season(start_date.month)  
        return f"{season} {start_date.year}"  
    
    # 如果没有匹配到开始和结束日期,尝试匹配单独的日期:Sep 17, 2016  
    match = re.match(r'(\w+ \d+, \d+)', aired_date)  
    if match:  
        date_str = match.group(1)  
        date_sigle = datetime.strptime(date_str, '%b %d, %Y') 
        season = get_season(date_sigle.month)  
        return f"{season} {date_sigle.year}" 
      
    # 如果没有匹配到开始和结束日期,尝试匹配单独的日期:17-Jan-20
    match = re.match(r'(\d+)-(\w+)-(\d+)', aired_date)  
    if match:  
        year_str, month_str, day_str = match.groups()  
        month_num = get_month_number(month_str)  
        if month_num is not None:  
            year = int(year_str)  
            if len(year_str) == 2:  # 如果是两位数的年份,可能需要一些逻辑来确定实际年份(例如,基于当前年份)  
                year += 2000 if int(year_str) > 20 else 1900  # 简化的年份推断,可能需要调整  
            season = get_season(month_num)  
            return f"{season} {year}" 
    # 如果没有匹配到开始和结束日期,尝试匹配单独的日期:May 2003
    match = re.search(r'(\w{3})\s(\d{4})', aired_date)  
    if match:  
        month_str, year_str = match.groups()  
        month_num = get_month_number(month_str)  
        year = int(year_str)  
        if month_num is not None:  
            return f"{get_season(month_num)} {year}" 
    # 如果没有匹配到任何日期格式,返回aired_date值或NaN,比如传来的值为2003
    return pd.NA    
  
def get_month_number(month_str):  
    # 将月份字符串转换为数字(例如,"Jan" -> 1)  
    month_dict = {  
        'Jan': 1, 'Feb': 2, 'Mar': 3, 'Apr': 4,  
        'May': 5, 'Jun': 6, 'Jul': 7, 'Aug': 8,  
        'Sep': 9, 'Oct': 10, 'Nov': 11, 'Dec': 12  
    }  
    return month_dict.get(month_str)  
  
def get_season(month):  
    # 根据月份返回季节(Spring, Summer, Fall, Winter)  
    if 3 <= month <= 5:  
        return 'Spring'  
    elif 6 <= month <= 8:  
        return 'Summer'  
    elif 9 <= month <= 11:  
        return 'Fall'  
    else:  
        return 'Winter'  
  

# 使用自定义函数填充premiered列的缺失值  
anime_data_filled['premiered'] = anime_data_filled['premiered'].fillna(anime_data_filled['aired'].apply(infer_premiered_season))  
print(anime_data_filled[anime_data_filled['premiered'].isnull()])
#此时输出如下,只有年份的数据,获取不到季节
#                                                  name        type     episodes  \
#1234  Saint Seiya: Meiou Hades Juuni Kyuu-hen - Yomi...     Special        2   
#1265  Meitantei Conan Movie 10: Tantei-tachi no Requ...  TV Special        1   
#1359  Meitantei Conan Movie 09: Suihei Senjou no Str...  TV Special        1   
#1690  Meitantei Conan OVA 04: Conan to Kid to Crysta...         OVA        1   
#1944                           Junjou Romantica Special     Special        1   
#               status aired premiered broadcast            producers  \
#1234  Finished Airing  2003      <NA>       NaN         ['add some']   
#1265  Finished Airing  2006      <NA>       NaN         ['add some']   
#1359  Finished Airing  2005      <NA>       NaN         ['add some']   
#1690  Finished Airing  2004      <NA>       NaN         ['add some']   
#1944  Finished Airing  2008      <NA>       NaN  ['Kadokawa Shoten'] 

#删除还是缺失值的数据
anime_data_filled = anime_data_filled.dropna(subset=['premiered'])
print(anime_data_filled[anime_data_filled['premiered'].isnull()])
#输出
#Empty DataFrame
#Columns: [name, type, episodes, status, aired, premiered, broadcast, producers, licensors, studios, source, genres, duration, rating, score, ranked, popularity, favorites]
#Index: []

3.拆列,获取元数据

上一部分对premiered的处理是为了统一成“季度 年份”的格式,然后将其拆分成年列和季度列,同时四个季度可以赋予不同的数值:

#继续处理premiered  
# 定义一个函数将季节转换为数字  
def season_to_number(season):  
    season_dict = {  
        'Spring': 1,  
        'Summer': 2,  
        'Fall': 3,  
        'Winter': 4  
    }  
    return season_dict.get(season, None)  
  
# 使用str.split方法拆分'premiered'列,并扩展结果到新的列  
# 注意:我们使用expand=True,分割后的两部分将作为两列(假设分割成功)添加到新的DataFrame中  
season_year_df = anime_data_filled['premiered'].str.split(n=1, expand=True)  
  
# 给新列重命名  
season_year_df.columns = ['season', 'year']    
# 将年份列转换为整数  
season_year_df['year'] = season_year_df['year'].astype(int)    
# 将拆分后的DataFrame添加到原始DataFrame中  
anime_data_filled = pd.concat([anime_data_filled, season_year_df], axis=1)  
# 创建一个新的'quarter'列,其中包含季节的数字表示  
anime_data_filled['quarter'] = anime_data_filled['season'].apply(season_to_number)  
  
# 显示结果  
print(anime_data_filled.head(3))
name……premiered……yearquarter
Sousou no Frieren TV……Fall 2023……20233
Steins;Gate TV……Spring 2011……20111
Fullmetal Alchemist: Brotherhood TV……Spring 2009……20091

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1900081.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

大数据Spark 面经

1: Spark 整体架构 Spark 是新一代的大数据处理引擎&#xff0c;支持批处理和流处理&#xff0c;也还支持各种机器学习和图计算&#xff0c;它就是一个Master-worker 架构&#xff0c;所以整个的架构就如下所示&#xff1a; 2: Spark 任务提交命令 一般我们使用shell 命令提…

【HICE】web服务搭建之仓库

1.首先将1.conf变成vhost&#xff0c;从而使监听号只有最普通的&#xff0c;并且进行更新。 2.挂载 mount /dev/sr0 /var/www/html 3.更改本地仓库路径 4.测试&#xff1a;下载软件包&#xff0c;在删除 5.删除软件包在取消挂载&#xff0c;在下载软件包失败

计算机网络-IP组播基础

一、概述 在前面的学习交换机和路由协议&#xff0c;二层通信是数据链路层间通信&#xff0c;在同一个广播域间通过源MAC地址和目的MAC地址进行通信&#xff0c;当两台主机第一次通信由于不清楚目的MAC地址需要进行广播泛洪&#xff0c;目的主机回复自身MAC地址&#xff0c;然后…

C++:this指针到底是什么东西

一、this指针概述 在C中&#xff0c;this是一个隐含的指针&#xff0c;它指向当前正在被调用的函数的对象实例。当你在一个成员函数内部引用self, me, 或者是无名的"this"时&#xff0c;实际上是访问了这个特殊的变量。this通常用于区分函数参数和局部变量&#xff0…

linux驱动编程 - kfifo先进先出队列

简介&#xff1a; kfifo是Linux Kernel里面的一个 FIFO&#xff08;先进先出&#xff09;数据结构&#xff0c;它采用环形循环队列的数据结构来实现&#xff0c;提供一个无边界的字节流服务&#xff0c;并且使用并行无锁编程技术&#xff0c;即当它用于只有一个入队线程和一个出…

机器学习筑基篇,​Ubuntu 24.04 编译安装 Python 及多版本切换

[ 知识是人生的灯塔&#xff0c;只有不断学习&#xff0c;才能照亮前行的道路 ] Ubuntu 24.04 编译安装最新Python及多版本切换 描述&#xff1a;说到机器学习&#xff0c;人工智能&#xff0c;深度学习不免会提到Python这一门编程语言&#xff08;人生苦短&#xff0c;及时Pyt…

Redis的zset的zrem命令可以做到O(1)吗?

事情是这样的&#xff0c;当我用zrem命令去移除value的时候&#xff0c;我知道他之前会做的几个步骤 1、查找这个value对应的score&#xff08;通过zset中的dict&#xff09;2、根据这个score查找到跳表中的节点3、删除这个节点 我就想了一下为什么dict为什么要保存score呢&a…

Caffeinated for Mac v2.0.6 Mac防休眠应用 兼容 M1/M2/M3

Caffeinated 可以防止您的 Mac 进入休眠状态、屏幕变暗或者启动屏幕保护。 应用介绍 您的屏幕是否总是在您不希望的时候变暗&#xff1f;那么Caffeinated就是您解决这个大麻烦的最好工具啦。Caffeinated是在Caffeine这个非常便捷、有用的工具的基础上开发而来的。Caffeinated…

insert阻塞了insert?

一、发现问题 在arms监控页面看到某条insert语句的执行时长达到了431毫秒。 数据库中存在&#xff0c;insert语句受到了行锁阻塞&#xff0c;而阻塞的源头也在执行同样的insert语句&#xff0c;同样都是对表USERSYS_TASK_USER_LOG_TEMP01的插入操作&#xff0c;很是费解。 二…

vue2-vue3响应式原理

我们先来看一下响应式意味着什么&#xff1f;我们来看一段代码&#xff1a; m有一个初始化的值&#xff0c;有一段代码使用了这个值&#xff1b;那么在m有一个新的值时&#xff0c;这段代码可以自动重新执行&#xff1b; let m 20 console.log(m) console.log(m * 2)m 40上…

深圳航空顶象验证码逆向,和百度验证码训练思路

声明(lianxi a15018601872) 本文章中所有内容仅供学习交流使用&#xff0c;不用于其他任何目的&#xff0c;抓包内容、敏感网址、数据接口等均已做脱敏处理&#xff0c;严禁用于商业用途和非法用途&#xff0c;否则由此产生的一切后果均与作者无关&#xff01; 前言(lianxi a…

你的 Mac 废纸篓都生苍蝇啦

今天给大家推荐个免费且有趣的小工具 BananaBin&#xff0c;它可以在你的废纸篓上“长”一些可爱的苍蝇&#x1fab0;。 软件介绍 BananaBin 是 macOS 上的一款有趣实用工具&#xff0c;当你的垃圾桶满了时&#xff0c;它会提醒你清理。这个软件通过在垃圾桶上添加互动的苍蝇…

让ChatGPT干正事、说人话、会思考!借助ChatGPT润出优质论文的实操指南

大家好&#xff0c;感谢关注。我是七哥&#xff0c;一个在高校里不务正业&#xff0c;折腾学术科研AI实操的学术人。关于使用ChatGPT等AI学术科研的相关问题可以和作者七哥&#xff08;yida985&#xff09;交流&#xff0c;多多交流&#xff0c;相互成就&#xff0c;共同进步&a…

Linux笔记之一

Linux笔记之一 一、Linux基本概念1.1 概念1.2 为什么要学Linux 二、Linux基本目录三、Linux基本命令3.1 相对路径3.2 绝对路径3.3 Linux基本命令3.3.1 处理目录的命令3.3.2 创建文件的命令3.3.3 内容查看命令 总结 一、Linux基本概念 1.1 概念 Linux&#xff0c;全称GNU/Linu…

啥?你没听过SpringBoot的FatJar?

写在最前面&#xff1a; SpringBoot是目前企业里最流行的框架之一&#xff0c;SpringBoot的部署方式多数采用jar包形式。通常&#xff0c;我们使用java -jar便可以直接运行jar文件。普通的jar只包含当前 jar的信息&#xff0c;当内部依赖第三方jar时&#xff0c;直接运行则会报…

Python 空间和时间高效的二项式系数(Space and time efficient Binomial Coefficient)

这里函数采用两个参数n和k&#xff0c;并返回二项式系数 C(n, k) 的值。 例子&#xff1a; 输入&#xff1a; n 4 和 k 2 输出&#xff1a; 6 解释&#xff1a; 4 C 2 等于 4!/(2!*2!) 6 输入&#xff1a; n 5 和 k 2 输出&#xff1a; 10 解释&#xff1a; 5 C …

关于GIS的概念方面在前端编程中的理解

关于GIS的概念方面在前端编程中的理解 一. 什么是gis二. 关于地球的建模(了解)三. GIS坐标系表现形式四.GIS的数据4.1 矢量数据4.2 栅格数据4.3 矢量数据和栅格数据的不同 一. 什么是gis 地理坐标系统&#xff0c;其目的就是通过地理坐标系可以确定地球上任何一点的位置。 二. …

springboot网吧信息管理系统-计算机毕业设计源码31030

目录 摘要 1 绪论 1.1 选题背景与意义 1.2国内外研究现状 1.3 本课题主要工作 1.4论文结构与章节安排 2系统分析 2.1.1 技术可行性分析 2.1.2 经济可行性分析 2.1.3 法律可行性分析 2.2 系统流程分析 2.2.1 数据新增流程 2.2.2 数据删除流程 2.3 系统功能分析 2.…

YOLO之boxes小记

import cv2 from ultralytics import YOLO # 加载模型 model YOLO(modelyolov8n.pt) results model(sourceanimal.jpg)result results[0] img result.plot() from matplotlib import pyplot as plt # matplotlib :rgb模式 # cv:bgr模式 plt.imshow(Ximg[:,:,::-1])result.b…

海睿思问数(TableGPT):开创企业新一代指标应用模式

1 指标建设对企业经营管理数字化的价值分析 指标是将海量数据中关键信息提炼和挖掘出来&#xff0c;以数据为载体展示企业经营管理和分析中的统计量。它通过分析数据&#xff0c;形成一个具有度量值的汇总结果&#xff0c;使得业务状态可以被描述、量化和分解。指标通常由度量…