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

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, 2007match = 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-20match = 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 2003match = 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,比如传来的值为2003return 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.mzph.cn/web/40089.shtml

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

相关文章

QT实现GIF动图显示(小白版,可直接copy使用)

需要你自己提前设置好动图的位置&#xff0c;本例中存放于"/Users/PLA/PLA/PLA.gif widget.h #ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include <QMovie> #include <QLabel>class Widget : public QWidget {Q_OBJECTpublic:explicit Wid…

深入分析 Android BroadcastReceiver (九)

文章目录 深入分析 Android BroadcastReceiver (九)1. Android 广播机制的扩展应用与高级优化1.1 广播机制的扩展应用1.1.1 示例&#xff1a;有序广播1.1.2 示例&#xff1a;粘性广播1.1.3 示例&#xff1a;局部广播 1.2 广播机制的高级优化1.2.1 示例&#xff1a;使用 Pending…

空调计费系统是什么,你知道吗

空调计费系统是一种通过对使用空调的时间和能源消耗进行监测和计量来进行费用计算的系统。它广泛应用于各种场所&#xff0c;如家庭、办公室、商场等&#xff0c;为用户提供了方便、准确的能源使用管理和费用控制。 可实现功能 智能计费&#xff1a;中央空调分户计费系统通过智…

SOLIDWORKS分期许可(订阅形式),降低前期的投入成本!

SOLIDWORKS 分期许可使您能够降低前期软件成本&#xff0c;同时提供对 SOLIDWORKS 新版本和升级程序的即时访问&#xff0c;以及在每个期限结束时调整产品的灵活性&#xff0c;帮助您跟上市场需求和竞争压力的步伐。 目 录&#xff1a; ★ 1 什么是SOLIDWORKS分期许可 ★ 2 …

gen_region_line 生成直线

gen_region_line (Operator) Name 名称 gen_region_line — Store input lines as regions.将输入行存储为region。 生成直线&#xff0c;直线区域 Signature 签名 gen_region_line( : RegionLines : BeginRow, BeginCol, EndRow, EndCol : ) Description 描述 运算符ge…

【LLM大模型】程序员为什么要学习大模型应用开发?

0 prompt engineer 就是prompt工程师它的底层透视。 1 学习大模型的重要性 底层逻辑 人工智能大潮已来&#xff0c;不加入就可能被淘汰。就好像现在职场里谁不会用PPT和excel一样&#xff0c;基本上你见不到。你问任何一个人问他会不会用PPT&#xff0c;他都会说会用&#…

请查收!模拟电路精选书单一份(可下载)

在电子工程的广阔天地中&#xff0c;模拟电路设计是一门艺术&#xff0c;也是一种科学。它要求设计师不仅要有深厚的理论知识&#xff0c;还要有精湛的实践技能。随着技术的发展&#xff0c;模拟电路设计领域不断涌现新的理论、技术和工具&#xff0c;这使得学习和掌握模拟设计…

css使用伪元素after或者before的时候想要给after设置z-index无效

css使用伪元素after或者before的时候想要给after或者before设置一个层级关系&#xff0c;使该伪类写入的样式在box的下面&#xff0c;发现给box设置z-index无效&#xff0c; 需要找到父级元素&#xff0c;在父级元素上设置z-index值并且将伪类设置z-index:-1

开放式耳机哪个牌子好?五款优质产品推荐,老司机带飞!

后台有粉丝滴滴我说&#xff0c;还想再多分享一些耳机的测评或者选购指南&#xff0c;开放式耳机确实越来越火了&#xff0c;市面上的品牌从十几块到几千块的开放式耳机也比比皆是&#xff0c;但是要选择适合自己的一款开放式耳机确实还挺难的&#xff0c;所以作为耳机测评师这…

深入解析大型语言模型:从训练到部署大模型

简介 随着数据科学领域的深入发展&#xff0c;大型语言模型——这种能够处理和生成复杂自然语言的精密人工智能系统—逐渐引发了更大的关注。 LLMs是自然语言处理&#xff08;NLP&#xff09;中最令人瞩目的突破之一。这些模型有潜力彻底改变从客服到科学研究等各种行业&…

SAP-SD同一物料下单价格确不同

业务说明&#xff1a; 业务部门反馈&#xff0c;同一物料下销售订单时&#xff0c;价格确不同。 那么这个价格是怎么取到的呢&#xff1f; 逻辑说明&#xff1a; 1、首先查看销售订单 可以看到相同物料价格是不同的&#xff0c;条件类型都是ZPR5&#xff0c;但是客户是不同…

如何网页在线编辑微软Office Word,并导出为PDF格式。

随着互联网技术的不断发展&#xff0c;越来越多的企业开始采用在线办公模式&#xff0c;微软Office Word 是最好用的文档编辑工具&#xff0c;然而doc、docx、xls、xlsx、ppt、pptx等格式的Office文档是无法直接在浏览器中直接打开的&#xff0c;如果可以实现Web在线预览编辑Of…

SpringBoot | 大新闻项目源码打包

对于一个完成好的后端项目&#xff0c;如何进行打包发送给其他人&#xff0c;在电脑上进行查看 1.在pom.xml添加&#xff1a; <build><plugins> <!-- 打包插件--><plugin><groupId>org.springframework.boot</groupId><art…

Cube-Studio:开源大模型全链路一站式中台

开源项目&#xff0c;欢迎star哦&#xff0c;https://github.com/data-infra/cube-studio 一款真正意义的 LLMOps 框架 LLMOps&#xff08;Large Language Model Operations&#xff09;是一个涵盖了大型语言模型&#xff08;如GPT系列&#xff09;开发、部署、维护和优化的一…

【深度学习】第3章实验——回归模型

根据相关数据集进行回归分析 1. import statsmodels.api as sm # df.loc[:, ...] 表示选择所有行。 # df.columns != mpg 创建一个布尔数组,指示哪些列不等于 mpg。 # df.loc[:, df.columns != mpg] 选择 df 中所有行和列名不等于 mpg 的所有列。 x =df.loc[:,df.columns!=m…

Python酷库之旅-第三方库Pandas(004)

目录 一、用法精讲 5、pandas.DataFrame.to_csv函数 5-1、语法 5-2、参数 5-3、功能 5-4、返回值 5-5、说明 5-6、用法 5-6-1、代码示例 5-6-2、结果输出 6、pandas.read_fwf函数 6-1、语法 6-2、参数 6-3、功能 6-4、返回值 6-5、说明 6-6、用法 6-6-1、代码…

05-《猪笼草》

猪笼草 猪笼草是猪笼草属全体物种的总称。属于热带食虫植物&#xff0c;原产地主要为旧大陆热带地区。其拥有一个独特的吸取营养的器官——捕虫笼&#xff0c;捕虫笼呈圆筒形&#xff0c;下半部稍膨大&#xff0c;笼口上具有盖子&#xff0c;因其形状像猪笼而得名。 猪笼草 形…

昂首平台一分钟理清VSA理论的市场阶段

VSA的英文全程是volume spread analysis&#xff0c;翻译过来就是成交量价格幅度差分析&#xff0c;从名字角度就也可以重点看出&#xff0c;VSA分析法主要是从成交量供应分析来分析。但是很多投资者不理解VSA理论的市场阶段&#xff0c;今天昂首平台就和投资者一分钟理清。 根…

第五篇——谋攻篇:韩信该死,拿破仑该亡

目录 一、背景介绍二、思路&方案三、过程1.思维导图2.文章中经典的句子理解3.学习之后对于投资市场的理解4.通过这篇文章结合我知道的东西我能想到什么&#xff1f; 四、总结五、升华 一、背景介绍 人生也是如此&#xff0c;伤敌一千&#xff0c;自损八百&#xff1b;而不…

AI绘画擦边变现赛道怎么玩?新手小白必看教程!

今天给大家介绍一个用 AI 搞擦边的变现赛道 而且可以说是0 成本变现的 现在真的越来越多的人都想 0 成本变现&#xff0c;那么 0 成本到底能不能变现&#xff0c;变现的上下限又是多少&#xff1f; 今天这个案例就可以很好的进行说明 可以说 AI 是现在第一生产力&#xff0…