Python_pandas:读取CSV文件、查找指定列和单元格、解决NaN问题

本文介绍了为什么在数据分析中不推荐使用csv库,推荐使用pandas读取CSV文件的原因,并展示了如何使用pandas进行CSV操作,包括读取文件、查找指定列和单元格以及解决NaN问题。通过实例解释了pandas的便利性和处理缺失值的策略。

目录

为什么不推荐用csv库?

为什么推荐使用pandas读取csv文件?

开始pandas操作csv文件之旅:

0.csv文件预览

1.读取csv文件

2.查找指定列及指定单元格

2.1指定列:通过索引指定列名为hour的列

2.2指定单元格:1001A列23时的AQI值

3.解决遇到的"NAN"


为什么不推荐用csv库?

本段说说使用csv库常见的问题:

  1. csv.DictWriter():该函数返回的结果遍历一次之后,再次遍历返回的结果是空列表。
  2. csv.reader():返回的结果是结构体,需要for循环才能调用,不能像list那样直接选取特定单元格。
  3. 通过列名来查找指定列的操作麻烦。
    #选择特定的单元格
    
    reader = csv.reader(filenanme)
    for row in reader:
        print(row[0])

以上问题如何解决:

  1. 每次循环遍历完,重新使用csv.DictWriter()函数读取文件。
  2. 继续熟练使用。
  3. 转身拥抱pandas。

为什么推荐使用pandas读取csv文件?

  1. 方便,有专门支持读取csv文件的pd.read_csv()函数。
  2. 将csv转换成二维列表形式
  3. 支持通过列名查找特定列。
  4. 相比csv库,事半功倍。

<think> 我们有一个CSV文件,需要将其中所有的空白单元格替换为字符串"nan" 步骤: 1. 读取同目录下的testdata_processs.csv文件(注意文件名,用户写的是testdata_processs.csv,可能是拼写错误,但按用户要求) 2. 遍历每一行每一列,如果单元格为空(可能是空字符串'',或者None),则替换为字符串"nan" 3. 将处理后的数据写回到原文件(或新文件,但用户要求是同文件,所以覆盖原文件) 注意:CSV文件中,空白单元格可能被读取为None或空字符串''。但根据csv模块,默认情况下,空行会被视为空字符串''。 然而,我们需要注意,如果原文件中有引号引起的空值(例如,"")可能也被视为空字符串。所以我们将所有空字符串视为空白单元格。 另外,我们也可以考虑使用pandas库,这样更简单。但用户没有明确要求,且引用中都是使用csv模块,所以我们可以用csv模块实现。 但是考虑到用户没有安装pandas的可能性,我们使用标准库csv。 由于要覆盖原文件,我们可以先读取所有数据,处理后再写回。 具体步骤: a. 打开文件读取,使用csv.reader,这样我们得到一个二维列表。 b. 遍历每一行,对每个单元格进行判断:如果单元格内容是空字符串(或None)则替换为"nan"。 c. 将处理后的数据写回到同一个文件名。 但是注意:如果原文件有表头,我们不应该改变表头。但用户要求是空白单元格,所以表头中的空白单元格也会被替换。这符合要求。 另外,用户要求的是“空白单元格”,我们只处理空字符串None。注意空格字符串(' ')不是空字符串,所以不处理。如果用户希望将空格字符串也视为空白,需要特别说明,但这里没有,所以我们只处理空字符串None。 由于csv.reader读取时,空单元格就是空字符串,所以我们只需要判断是否为''即可。 但是,如果原文件中有一些单元格是多个空格,我们希望保留,所以不处理。 因此,我们只将空字符串(即长度为0的字符串)替换为"nan"。 代码步骤: 1. 导入csv模块 2. 打开文件读取模式)读取所有行到列表 3. 遍历每一行,对行中的每个元素,如果是空字符串('')则替换为'nan' 4. 打开同一文件(写入模式,注意覆盖原文件),使用csv.writer将数据写回 注意:写入时,如果原文件有特殊格式(如分隔符、引号等),我们需要保持一致。默认使用相同的分隔符(逗号)引号规则。 但是,为了安全,我们可以先读取第一行来获取分隔符,但通常我们使用逗号分隔。所以我们可以假设逗号分隔。 另外,写入时,为了避免空行问题,需要指定newline=''(在打开文件时)。 由于我们读取全部数据到内存,所以适合文件不大的情况。 如果文件很大,我们需要逐行读取并写入一个临时文件,最后替换原文件。但用户没有说明文件大小,我们假设文件不大。 但为了安全,我们可以使用临时文件的方法,但这里我们先采用全部读取再写回的方式。 代码: 注意:用户要求的是与脚本同路径下的文件,所以我们可以直接使用文件名。 实现: 由于原文件名是“testdata_processs.csv”,注意拼写。 我们假设脚本文件在同一目录下。 开始写代码: </think> 以下是一个Python脚本,用于将同路径下`testdata_processs.csv`文件中所有空白单元格替换为"nan"字符: ```python import csv # 步骤1:读取原始CSV数据 rows = [] with open('testdata_processs.csv', 'r', newline='') as f_in: reader = csv.reader(f_in) # 遍历每一行 for row in reader: # 步骤2:替换空白单元格为"nan" processed_row = ['nan' if cell.strip() == '' else cell for cell in row] rows.append(processed_row) # 步骤3:写回处理后的数据 with open('testdata_processs.csv', 'w', newline='') as f_out: writer = csv.writer(f_out) writer.writerows(rows) print("空白单元格已成功替换为'nan'") ``` ### 实现原理: 1. **读取数据** 使用`csv.reader`读取CSV文件的所有行,每行存储为列表 2. **空白单元格检测** - 使用`cell.strip() == ''`检测空白单元格(包括空字符串纯空格) - 列表推导式`['nan' if ... else ...]`实现批量替换 3. **写回文件** 使用`csv.writer`将处理后的数据覆盖写回原文件 > 注意事项: > - 脚本需与CSV文件放在同一目录 > - 原文件中的引号、特殊字符会被保留 > - "nan"会作为普通字符串写入(非浮点数NaN) > - 支持包含逗号/换行的单元格(自动处理引号)[^1][^2] ### 扩展建议: 如需处理更复杂的空值(如`NULL`, `N/A`),可修改判断条件: ```python # 扩展多种空值检测 processed_row = [ 'nan' if cell.strip() in ('', 'NULL', 'N/A', 'NA') else cell for cell in row ] ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值