开篇
上一篇是用手工数据造表,这一篇我直接用了一份 600 多行的真实销售数据 data/sales.csv,学两件最实用的事:读文件和写文件。
读取数据:read_csv
最朴素的写法是一行:
df = pd.read_csv('data/sales.csv')
但这份文件里有 7 列(订单号、产品类别、产品名称、销售数量、单价、客户所在城市、支付方式、订单日期),我这一章只需要其中 4 列,于是用 usecols 参数在读取阶段就把不需要的列丢掉:
df = pd.read_csv('data/sales.csv',
usecols='订单号', '产品类别', '销售数量', '单价')
我的体会是:usecols 这种"在读取时就筛掉"的写法,比先全读进来再删列要省内存也更清晰。
顺便说一个我遇到的坑:sales.csv 是中文表头,用记事本或者 PowerShell 直接打开看是乱码的,但 Pandas 读进来显示完全正常。所以判断编码好不好,不要靠肉眼打开文件,要以程序读出来的结果为准。
处理数据:给表格加一列
读进来之后,数据分析最常见的第一步就是"造新列"。销售金额 = 销售数量 × 单价:
df'销售金额' = df'销售数量' * df'单价'
这行让我挺震撼的------没有 for 循环。如果是以前写 Python,我得一行一行遍历再乘,这里 Pandas 直接把两整列对应相乘(叫向量化运算),而且结果自动变成新的一列挂进表里。列名不存在时,这句等于"新建一列";列名已存在,就是覆盖。
顺便提醒一下自己:写 Python 脚本时习惯把中间结果 print 出来看,但在 Notebook 里我把赋值那行的 df 单独注释掉放在最后一行,就能看到漂亮的表格渲染,而 print(df) 输出的是纯文本。
写入数据:to_csv
处理完的数据要存下来交给别人用,就是 to_csv:
df.to_csv('data/sales_01.csv', index=False)
关键是 index=False。我一开始没加这个参数,打开生成的文件发现最左边多了一列 0,1,2,3... 的行号,第二次读这个文件时它就变成了一个莫名其妙的"无名列"。加上 index=False 就干净了。