技术图文: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:204
    Console.WriteLine("Embarked:" + j); //Embarked:889
}

利用Python读取CSV数据

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

import csv

with 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 pd

df = 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只需要配参数就好,结果耗费了不少时间精力,还没有人家写的好。哭死!!


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



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

青少年编程备考

感谢您的支持!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值