当前位置: 首页 > 编程日记 > 正文

技术图文:C# VS. Python 读取CSV文件指南

背景

CSV 是一种以逗号进行特征分隔的文本文件类型,在数据库或电子表格中是一种非常常见的导入导出格式。本篇图文就以泰坦尼克号船员获救预测( Kaggle)中使用的数据集为例来说明 C#、Python和Pandas 如何读取 CSV 数据的。

CSV原始文件如下图所示:

CSV原始文件

样本的特征如下:

  • PassengerId:乘客ID
  • Survival:是否生还(0 = No,1 = Yes)
  • Pclass:船仓等级(1 = 1st,2 = 2nd,3 = 3rd)
  • Name:姓名
  • Sex:性别
  • Age:年龄
  • Sibsp:兄弟姐妹(siblings)/配偶(spouses)数量
  • Parch:父母(parents)/子女(children)数量
  • Ticket:船票信息
  • Fare:费用
  • Cabin:船舱信息
  • Embarked:登船港口(C = Cherbourg,Q = Queenstown,S = Southampton)

技术分析

C# 属于强类型语言,CSV文件可以看作样本的集合,所以需要先定义样本的结构,之后再把每一个样本对象放入链表中形成集合。有了样本的集合我们就可以自己写代码或者使用LINQ技术来分析这些样本数据了。

Python 自带了CSV模块,通过CSV模块中的reader()方法可以得到序列的迭代器,之后用 foreach 语句获取所有的样本数据。

Pandas 更加的方便,通过read_csv()方法可以直接得到一个DataFrame结构,基于该结构可以进行下一步的数据分析。


利用C#语言读取CSV数据

Step1:把样本特征封装到类中。

public class PassengerItem
{public int PassengerId;public int Survived;public int Pclass;public string Name;public string Sex;public double Age;public int SibSp; public int Parch; public string Ticket; public double Fare; public string Cabin; public string Embarked; 
}

Step2:读取CSV获取样本的集合。

public static List<PassengerItem> GetData(string filePath)
{List<PassengerItem> result = new List<PassengerItem>();string[] strs = File.ReadAllLines(filePath);for (int i = 1; i < strs.Length; i++){string str = strs[i];if (string.IsNullOrEmpty(str))continue;PassengerItem pItem = new PassengerItem();int start = str.IndexOf(",\"", StringComparison.Ordinal);int end = str.IndexOf("\",", StringComparison.Ordinal);pItem.Name = str.Substring(start + 2, end - start - 2);str = str.Remove(start, end - start + 1);string[] s = str.Split(',');if (!int.TryParse(s[0].Trim(), out pItem.PassengerId)){pItem.PassengerId = int.MaxValue;}if (!int.TryParse(s[1].Trim(), out pItem.Survived)){pItem.Survived = int.MaxValue;}if (!int.TryParse(s[2].Trim(), out pItem.Pclass)){pItem.Pclass = int.MaxValue;}pItem.Sex = s[3].Trim();if (!double.TryParse(s[4].Trim(), out pItem.Age)){pItem.Age = double.MaxValue;}if (!int.TryParse(s[5].Trim(), out pItem.SibSp)){pItem.SibSp = int.MaxValue;}if (!int.TryParse(s[6].Trim(), out pItem.Parch)){pItem.Parch = int.MaxValue;}pItem.Ticket = s[7].Trim();if (!double.TryParse(s[8].Trim(), out pItem.Fare)){pItem.Fare = double.MaxValue;}pItem.Cabin = s[9].Trim();pItem.Embarked = s[10].Trim();result.Add(pItem);}return result;
}

Step3:利用LINQ来处理样本的数据。

static void Main(string[] args)
{List<PassengerItem> p = GetData(@".\train.csv");int i = p.Count(a => !string.IsNullOrEmpty(a.Cabin));int j = p.Count(a => !string.IsNullOrEmpty(a.Embarked));Console.WriteLine("Cabin:" + i); //Cabin:204Console.WriteLine("Embarked:" + j); //Embarked:889
}

利用Python读取CSV数据

使用 CSV 模块的reader()方法,从下面的代码长度,我们可以看出读取CSV文件 Python 比 C# 要简单的多,但统计某一列信息还需要推导式来辅助完成。

import csvwith open('train.csv') as f:reader = csv.reader(f)head_row = next(reader) # 读取表头  rows = [row for row in reader] # 读取数据集# 读取列Cabin = [row[10] for row in rows if row[10].strip() is not '']Embarked = [row[11] for row in rows if row[11].strip() is not '']print("Cabin:{0}".format(len(Cabin)))print("Embarked:{0}".format(len(Embarked)))# Cabin:204
# Embarked:889

利用Pandas读取CSV数据

使用Pandas的read_csv()方法可以很方便的读取CSV文件,之后可以通过行索引或列索引很方便的获取样本或特征数据。

import pandas as pddf = pd.read_csv(r'.\train.csv')
print(df.info())
# <class 'pandas.core.frame.DataFrame'>
# RangeIndex: 891 entries, 0 to 890
# Data columns (total 12 columns):
#  #   Column       Non-Null Count  Dtype  
# ---  ------       --------------  -----  
#  0   PassengerId  891 non-null    int64  
#  1   Survived     891 non-null    int64  
#  2   Pclass       891 non-null    int64  
#  3   Name         891 non-null    object 
#  4   Sex          891 non-null    object 
#  5   Age          714 non-null    float64
#  6   SibSp        891 non-null    int64  
#  7   Parch        891 non-null    int64  
#  8   Ticket       891 non-null    object 
#  9   Fare         891 non-null    float64
#  10  Cabin        204 non-null    object 
#  11  Embarked     889 non-null    object 
# dtypes: float64(2), int64(5), object(5)
# memory usage: 83.7+ KB

总结

本文介绍了如何利用C#、Python以及Pandas来读取CSV文件,通过对比可以发现Pandas最为便捷。有一个感悟是需要与大家分享的,针对不同的场景,要换不同的语言来实现呀,千万不要向我当年那样所有的场景都用自己最熟悉的语言,比如自己写SVM的实现,而sklearn只需要配参数就好,结果耗费了不少时间精力,还没有人家写的好。哭死!!


后台回复「搜搜搜」,随机获取电子资源!
欢迎关注,请扫描二维码:



相关文章:

零基础学软件测试去哪家培训机构好

移动互联网的时代&#xff0c;几乎每个人都是机不离手&#xff0c;手机软件的应用频率越来越高&#xff0c;软件测试这个岗位的发展前景更是非常可观&#xff0c;很多人都开始学习软测技术&#xff0c;想要知道零基础学软件测试去哪家培训机构好?来看看下面的详细介绍。 零基础…

技术图文:Numpy 一维数组 VS. Pandas Series

背景 Numpy 提供的最重要的数据结构是 ndarray&#xff0c;它是 Python 中 list 的扩展。 Pandas 提供了两种非常重要的数据结构 Series和DataFrame。 Numpy 中的一维数组与 Series 相似&#xff0c;一维数组只是提供了从0开始与位置有关的索引&#xff0c;而Series除了位置…

【Python】向函数传递任意数量的实参

传递任意数量的实参 有时候&#xff0c;你预先不知道函数需要接受多少个实参&#xff0c;好在Python允许函数从调用语句中收集任意数量的实参 def get_letter(*letters):for i in letters:print(i) get_letter(A,B,C,D,E)形参名*letters中的星号让Python创建一个名为letters的空…

word中插入下标

Word2007中为数字加上下标的几种方法&#xff1a; 一&#xff1a;通过插入>公式>>选择&#xff0c;通过此上下标。 二&#xff1a;写下数字&#xff0c;例如5&#xff0c;然后按ctrlshift号三个键&#xff0c;就可添加上标&#xff0c;按ctrl号两键&#xff0c;就可标…

手机应用软件测试的思路与要点

软件测试主要针对于移动互联网行业&#xff0c;那么APP等相关软件的测试工作是非常多的&#xff0c;尤其对于产品的手机项目(应用软件)&#xff0c;主要是进行系统测试。针对手机应用软件的系统测试&#xff0c;通常从如下几个角度开展&#xff1a;功能测试&#xff0c;兼容性测…

数据结构与算法:01 绪论

绪论 知识结构&#xff1a; 一、什么是数据结构 例1&#xff1a;电话号码薄的查询问题。 (a1,b1),(a2,b2),…,(an,bn)(a_1,b_1),(a_2,b_2),\dots,(a_n,b_n) (a1​,b1​),(a2​,b2​),…,(an​,bn​) aia_iai​&#xff1a;表示姓名&#xff0c;bib_ibi​&#xff1a;表示电话…

rar for linux缺少GLIBC_2.7

今天安装rar4.0 for linux&#xff0c;遇到了一个缺少GLIBC_2.7的问题&#xff0c;弄了好久才成功&#xff0c;记录一下&#xff0c;以备不时之需。 系统版本为CentOS 5.5。下载了rar4.0 for linux源码包&#xff0c;解压后&#xff0c;按照makfile文件的提示&#xff0c;进行安…

硅谷产学研的创新循环

在现代社会形态形成的几百年历史中&#xff0c;大学与产业界在分化的体制轨道中形成了各自不同的目标、结构和文化&#xff0c;有关大学与产业合作的种种争议无不缘自于此。今天当知识和技术逐步取代了自然资源和简单劳动力资源而成为首要的创造财富的源泉时&#xff0c;产业界…

java技术培训之File类中常用的构造方法

File类用于封装一个路径&#xff0c;这个路径可以是从系统盘符开始的绝对路径&#xff0c;如&#xff1a;“D:\file\a.txt”&#xff0c;也可以是相对于当前目录而言的相对路径&#xff0c;如&#xff1a;“src\Hello.java”。File类内部封装的路径可以指向一个文件&#xff0c…

数据结构与算法:02 C#语言基本语法结构

02 C#语言基本语法结构 知识结构&#xff1a; 1、数据类型 第一种分类&#xff1a; 简单数据类型&#xff1a;byte、short、int、long、float、double、char、bool组合数据类型&#xff1a;struct、enum、class、interface 类型描述byte无符号8位整型(ushort) short&#x…

积少成多 Flash(ActionScript 3.0 Flex 3.0) 系列文章索引

[源码下载]积少成多 Flash(ActionScript 3.0 & Flex 3.0) 系列文章索引作者&#xff1a;webabcdFlash 之 ActionScript 3.0 1、积少成多Flash(1) - ActionScript 3.0 基础之数据类型、操作符和流程控制语句介绍Flash ActionScript 3.0 中所有的数据类型都是对象&#xff0c…

WPF Snoop 2.7 源码研究

转载于:https://www.cnblogs.com/puncha/archive/2012/04/01/3877001.html

java培训基础知识都学哪些

很多人都开始学习java技术&#xff0c;觉得java语言在未来的发展前景空间非常大&#xff0c;事实却是如此&#xff0c;那么针对于零基础的同学&#xff0c; 学习java技术需要学哪些呢?下面我们就来看看java培训基础知识都学哪些? java培训基础知识都学哪些? 1.JavaWeb Linux…

数据结构与算法:03 C#面向对象设计 I

03 C#面向对象设计 I 知识结构&#xff1a; 1、类与对象 类&#xff1a;用高级程序语言实现的一个ADT描述。对象&#xff1a;通过类声明的变量。 2、封装 2.1 什么是封装 把类的内部隐藏起来以防止外部看到内部的实现过程。 2.2 怎样封装 通过限制修饰符private、protect…

Centos7安装编译安装zabbix2.219及mariadb-5.5.46

mariadb-5.5.46的安装&#xff1a; 首先下载mariadb-5.5.46-linux-x86_64.tar.gz&#xff0c;然后使用tar -xf mariadb-5.5.46-linux-x86_64.tar.gz -C /usr/local目录下 添加数据库组 # groupadd mysql 添加数据库用户 # useradd -g mysql mysql cd /usr/local ln -sv…

软件测试开发:常见测试类型概念

软件测试是软件开发中非常重要的一个环节&#xff0c;软件测试工程师需要对每个环节进行严格把控&#xff0c;才能保证系统在每个阶段得以控制。下面小编就为大家详细介绍一下软件测试开发:常见测试类型概念的相关内容。 软件测试开发:常见测试类型概念&#xff1a; (1)边界测试…

技术图文:C#语言中的泛型 I

C#语言中的泛型 I 知识结构&#xff1a; 1. 泛型概述 泛型广泛应用于容器&#xff08;Collections&#xff09;和对容器操作的方法中。 从 .NET Framework2.0 开始&#xff0c;微软提供了一个新的命名空间System.Collections.Generic&#xff0c;其中包含了一些新的基于泛型…

ubuntu搭建svn、git遇到的问题及解决办法

不错的git笔记博客&#xff1a; http://www.cnblogs.com/wanqieddy/category/406859.html http://blog.csdn.net/zxncvb/article/details/22153019 Git学习教程&#xff08;六&#xff09;Git日志 http://fsjoy.blog.51cto.com/318484/245261/ 图解git http://my.oschina.net/x…

webstorm同时打开多个project方法

曾经多次碰到过想要打开多个project的时候&#xff0c;可每次打开其他项目时&#xff0c;必须选择新窗口还是替换次窗口&#xff0c;如果新窗口的话就无法跟现在的项目在同一个webstorm中同时进行编辑&#xff0c;需要来回切换窗口&#xff0c;很是不方便&#xff0c;今天无意中…

什么业务场景适合使用Redis?

Redis(Remote Dictionary Server )&#xff0c;即远程字典服务&#xff0c;是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库&#xff0c;并提供多种语言的API。从2010年3月15日起&#xff0c;Redis的开发工作由VMware主持。从2013年…

Linux基础知识汇总(2)...持续更新中

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566软件安装: {软件安装的几种形式 rpm 由厂商提供二进制包 yum rpm源的前端管理器 src 源码包configure安装 bin 包含rpm和shell将安装一步执…

技术图文:C#语言中的泛型 II

C#语言中的泛型 II 知识结构&#xff1a; 6. 泛型接口 泛型类与泛型接口结合使用是很好的编程习惯&#xff0c;比如用IComparable<T>而非IComparable&#xff0c;以避免值类型上的装箱和拆箱操作。若将接口指定为类型参数的约束&#xff08;接口约束&#xff09;&#…

linux档案权限

Linux 下的档案当你对一个档案具有w权限时&#xff0c;你可以具有写入/编辑/新增/修改档案的内容的权限&#xff0c; 但并丌具备有删除该档案本身的权限&#xff01;对二档案的rwx来说&#xff0c; 主要都是针对『档案的内容』而觊&#xff0c;不档案档名的存在不否没有关系喔&…

新手UI设计师需要掌握的知识和技能

UI设计岗位在近几年的需求是越来越高的&#xff0c;很多零基础学员都开始学习UI设计技术&#xff0c;那么想要成为一名合格的UI设计师&#xff0c;新手UI设计师需要掌握的知识和技能是比较要会的&#xff0c;来看看下面的详细介绍。 新手UI设计师需要掌握的知识和技能&#xff…

数据结构与算法:04 C#面向对象设计 II

04 C#面向对象设计 II 知识结构&#xff1a; 5、属性 例1&#xff1a;属性概念的引入&#xff08;问题&#xff09; public class Animal {public int Age;public double Weight;public bool Sex;public Animal(int age, double weight, bool sex){Age age;Weight weight;S…

SharePoint迁移和升级方案

这是之前针对SharePoint迁移和升级写的方案&#xff0c;去掉了敏感的部分&#xff0c;共大家交流吧。SharePointMigrationSolution转载于:https://www.cnblogs.com/zhaojunqi/archive/2012/04/12/2444803.html

零基础如何掌握web前端开发技能

很多零基础学员想要进入到互联网行业都会选择web前端做首选技术语言来学习&#xff0c;但是学习web前端不是那么容易的&#xff0c;想要成为一名合格的web前端工程师&#xff0c;所要掌握的技能一定要会&#xff0c;下面小编就为大家详细的介绍一下零基础如何掌握web前端开发技…

数据结构与算法:05 Leetcode同步练习(一)

Leetcode同步练习&#xff08;一&#xff09; 题目01&#xff1a;两数之和 题号&#xff1a;1难度&#xff1a;简单https://leetcode-cn.com/problems/two-sum/ 给定一个整数数组 nums 和一个目标值 target&#xff0c;请你在该数组中找出和为目标值的那 两个整数&#xff0c;…

用Asp.net实现简单的文字水印

经常看见MOP上有人贴那种动态的图片&#xff0c;就是把一个字符串作为参数传给一个动态网页&#xff0c;就会生成一个带有这个字符串的图片&#xff0c;这个叫做文字水印。像什么原来的熊猫系列&#xff0c;还有后来的大树和金条&#xff0c;都挺有意思。这东西看着挺好玩的&am…

yum国内镜像

Centos-7修改yum源为国内的yum源 国外地址yum源下载慢,下到一半就断了,就这个原因就修改它为国内yum源地址 国内也就是ali 与 网易 以centos7为例 ,以 修改为阿里的yum源 先确定有wget 备份本地yum源 mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo_…