逗号分隔值(Comma-Separated Values,CSV,有时也称为字符分隔值,因为分隔字符也可以不是逗号),其文件以纯文本形式存储表格数据(数字和文本)。CSV文件由任意数目的记录组成,记录间以某种换行符分隔;每条记录由字段组成,字段间的分隔符是其它字符或字符串,最常见的是逗号或制表符。
在平时,经常会遇到csv文件存储标签信息,也会新建csv文件记录训练的情况。因此对csv文件的一些日常操作做一个总结,方便自己以后复习~~(搬运)~~
import csv
path_a=r'E:\pythonwork\data_raw.csv'
path_b=r'E:\pythonwork\data_pro.csv'
--------------------------------------------------------
#写法1
#这种写法,有打开open就要有关闭close!!
a=open(path_a) #open
#1.newline=''消除空格行
#2.文件不存在则新建,'w'代表只写
b=open(path_b,'w',newline='') #open
reader=csv.reader(a)
writer=csv.writer(b)
rows=[row for row in reader]
for row in rows[0:5]:
writer.writerow(row)
a.close() #close
b.close() #close
-------------------------------------------------------
#写法2
with open(path_a) as a:
reader = csv.reader(a)
rows=[row for row in reader]
with open(path_b,'w',newline='') as b:
writer=csv.writer(b)
for row in rows[0:5]:
writer.writerow(row)
import csv
path_a=r'E:\pythonwork\data_raw.csv'
path_b=r'E:\pythonwork\data_pro.csv'
a=open(path_a) #open
#'a+'代表追加
b=open(path_b,'a+',newline='') #open
reader=csv.reader(a)
writer=csv.writer(b)
rows=[row for row in reader]
for row in rows[-5::]:
writer.writerow(row)
a.close() #close
b.close() #close
import csv
path_b=r'E:\pythonwork\data_pro.csv'
b=open(path_b,'r')
reader=csv.reader(b)
rows=[row for row in reader]
column_len=len(rows[0])
#删除中间列
target=column_len//2
for i,row in enumerate(rows):
rows[i].remove(row[target])
b.close()
b=open(path_b,'w',newline='')
writer=csv.writer(b)
for row in rows:
writer.writerow(row)
b.close()
以我有限的使用次数以及非常主观的感受,csv库只能进行基本的操作,行操作方便,列操作繁琐。Pandas库要更灵活。
Costumer id | Name | Age |
---|---|---|
222645 | 张三 | 24 |
215421 | 李四 | 31 |
215958 | 王五 | 19 |
#查看python版本
import sys
sys.version
import pandas as pd
id=['222645','215421','215958']
name=['张三','李四','王五']
age=['24','31','19']
df=pd.DataFrame({'Costumer id':id,'Name':name,'Age':age})
#df.to_csv('costumer-information.csv') 会有乱码
df.to_csv('costumer-information.csv',encoding='gbk',index=None) #含中文,需要改变编码方式;保存在同级目录下
#添加一行
add_row_df=pd.DataFrame({'Costumer id':['222645'],'Name':['赵四'],'Age':['56']})
#new_df=pd.DataFrame({'Costumer id':'222645','Name':'赵四','Age':'56'}) 会报错
add_row_df.to_csv('costumer-information.csv',mode='a',encoding='gbk',header=0,index=None) #含中文,需要改变编码方式;保存在同级目录下
#添加一列——性别
add_col_df=pd.read_csv('costumer-information.csv',encoding='gbk')
add_col_df['sex']=['0','1','0','0']
add_col_df.to_csv('costumer-information.csv',columns=name.append('sex'),encoding='gbk',index=None,header=1) #含中文,需要改变编码方式;保存在同级目录下
关于删除的操作可以参考这篇博客《Python pandas 删除指定行/列数据》
数据可以在这里下载
import pandas as pd
csvfile='ecommerce_data.csv'
df=pd.read_csv(csvfile,encoding='ISO-8859-1') #不加编码方式就会报错,详见下方链接的解释
df.head() #输出前五行
df.tail() #输出最后五行
df.columns #输出列名
#正式开始分析
df=pd.read_csv(csvfile,encoding='ISO-8859-1',parse_dates=['InvoiceDate']) #将时间强制转换格式
#删除不需要的列description
df.drop(['Description'],axis=1,inplace=True)
#查找Customer ID为空值的行,并填充标识
df['CustomerID'] = df['CustomerID'].fillna('U')
#增加单条商品销售总额
df['amount']=df['Quantity']*df['UnitPrice']
#处理时间
df['date'] = [x for x in df['InvoiceDate'].dt.date]
df['year'] = [x.year for x in df['InvoiceDate']]
df['month'] = [x.month for x in df['InvoiceDate']]
df['day'] = [x.day for x in df['InvoiceDate']]
df['time']= [x for x in df['InvoiceDate'].dt.time]
df.drop(['InvoiceDate'],axis=1,inplace=True)
#去除重复条目
df=df.drop_duplicates()
df.describe()
#Quantity存在负值,导致amout存在负值,这代表着退货
#异常值处理
#查找是否存在单价是非正数
df1=df.loc[df['UnitPrice']<=0]
#计算异常数据的占比
print('单价异常的数据占比:{}%'.format(float(df1.shape[0]/df.shape[0]*100)))
#查找退货数据
df2=df.loc[df['Quantity']<=0]
#计算退货数据的占比
print('退货数据占比:{}%'.format(float(df2.shape[0]/df.shape[0]*100)))
#每年按月份统计退货的金额
import numpy as np
tt = pd.pivot_table(df2,index='year',columns='month',values='amount',aggfunc={'amount':np.sum})
tt
df_use=df[(df['UnitPrice']>0)&(df['Quantity']>0)]
#每年按月份统计销售金额
import numpy as np
pp = pd.pivot_table(df_use,index='year',columns='month',values='amount',aggfunc={'amount':np.sum})
#退货金额统计
withdraw=np.abs(tt/pp)
#每个客户所下的订单数量
F_value = df_use.groupby('CustomerID')['InvoiceNo'].nunique()
#每个客户的消费总金额
M_value = df_use.groupby('CustomerID')['amount'].sum()
import seaborn as sns
import matplotlib.pyplot as plt
sns.set(style='darkgrid')
plt.hist(M_value[M_value<5000],bins=100)
plt.xlabel('Amount')
plt.ylabel('Customer number')
plt.show()