昨天一位朋友问了一个程序问题:一个csv电子表格文件,里面有不规范数据,如何用pandas的dataframe,将某一列是空值的记录行删掉。
收到了CSV文件,如果RPROC_DMS_ID没有内容,则该行剔除。
该问题的最终答案并不太重要,更关键的是问题的解决思路和过程。我听说过pandas,但并没有用它写过一行相关代码,但这并不妨碍我解决这个问题。
运用《零基础都需要哪些基础》里提到的搜索技巧,第一种直接的办法是谷歌搜索。我以前学过R语言,知道这个dataframe的大概功能,这种问题在大数据分析里称为数据清洗,需要将不规范的数据(例如空值null)剔除掉。我马上想到的搜索关键字是pandas dataframe filter null。
第三条搜索结果的drop rows与我的问题描述太吻合了,直接点开这个网页,里面有一行简短的说明和代码。
第一步:安装pandas
在《站在巨人的肩膀上》里已经学会了安装程序包,重复一次那个过程:
python -m pip install pandas
第二步:读入csv文件
由于我以前没学过pandas,所以仍是搜索pandas read csv,发现了这行代码:
import pandas
df = pandas.read_csv('data.csv')
运行出错,错误信息:
UnicodeDecodeError: 'utf-8' codec can't decode byte 0xa8 in position 3:
invalid start byte
看到utf-8,再根据以前的编程经验,感觉是字符集不正确。翻阅read_csv()函数的帮助,发现了encoding选项,又因为csv文件中并没有汉字,看来也不可能是GBK等字符集,先试试 iso-8859-1 吧,竟然直接通过!
df = pandas.read_csv('data.csv', encoding='iso-8859-1')
第三步:筛选数据
把搜索到的代码直接录入,字段名换换。
df2 = df[np.isfinite(df['RPROC_DMS_ID'])]
又报错:NameError: name 'np' is not defined
在《零基础学编程012:画出复利曲线图》里,我见过numpy被缩写为np,看来就是它的问题。
import numpy
df2 = df[numpy.isfinite(df['RPROC_DMS_ID'])]
运行正常,看看记录数变化了吗?
print(len(df), len(df2))
看到记录数从10683变成了10000行,看来好像是完成任务了。检查的办法还需要其它函数,这里不展开介绍了。
小结:
最终代码:
import numpy
import pandas
df = pandas.read_csv('data.csv', encoding='iso-8859-1')
df2 = df[numpy.isfinite(df['RPROC_DMS_ID'])]
print(len(df), len(df2))
--- END ---