处理数据链接
https://www.docin.com/p-2114228626.html
csv文件字段应该如下
USERID 表示用户id; Time 表示收集时间; T表示该记录的时间点,以距离开机时间的秒数形式记录,例如8933表示距离开机时间的8933秒后; P表示焦点窗口的窗口进程名; I表示焦点窗口的窗口进程号; U表示浏览器窗口的地址栏内容,即当前浏览网页的URL(为了保护样本隐私,已将URL中第1个问号之后的参数部分截断); A表示浏览器窗口的地址栏句柄; B表示浏览器窗口的当前标签页句柄; V表示焦点窗口对应的程序版本号; W表示非浏览器焦点窗口的窗口句柄; N表示焦点窗口对应的程序名称(仅在第一次出现时记录); C表示焦点窗口对应的程序所属公司名(仅在第一次出现时记录)。
import pandas as pd
csv_data = pd.read_csv("Transactions.csv")
#统计购物项
head_row =0
for i in csv_data["Model"]:
if i not in head_row:
head_row.append(i)
#统计订单号
order_number =0
for i in csv_data["OrderNumber"]:
if i not in order_number:
order_number.append(i)
#新建—个以购物项为列名,订单号为索引的表格
new_table = pd.DataFrame(columns=head_row,index=order_number)#写内容
for j in csv_data.iterrows():
new_table.loc[j[1][0]]0[1][1]]=1
#数据写入csv文件
new_table.to_csv('Transactions_new.csv', sep='., header=True, index=True)#单文本处理
import pandas as pd
import re
def txtfile_process(inpath,formatfile,outpath):
#确定文件格式
files = pd.read_csv(formatfile,index_col=0)
df = pd.DataFrame(files)
#f = open('data/behavior/2012-05-07/0AB6BBBEDFF24EC8BAAC905F45AE314C_2012-05-07_21-22-38.txt',encoding='utf-8')
f = open(inpath,encoding='utf-8')
file=f.readlines()
#创建索引
#df.index = range(len(df))
#df.reindex(index=range(100))
for i,line in enumerate(file):
if(i<2) :
continue
a = line.strip('\n')
a=a.replace('[=]','@')
a_lists=a.split("@")
for str in a_lists:
str=str.replace('<=>','@')
result=str.split("@")
name =result[0]
value =result[1]
df.at[i-2,name]=value
#df[name][i-2]=value
#print("{1}= {0}".format(value,name))
#df[name][i-1].set_value.set_value(i,name,value)
print(a)
df.to_csv(outpath)
inpath ='data/behavior/2012-05-07/0AB6BBBEDFF24EC8BAAC905F45AE314C_2012-05-07_21-22-38.txt'
formatfile ='new_data.csv'
outpath ='newss_data.csv'
txtfile_process(inpath,formatfile,outpath)http://www.javashuo.com/article/p-odfboruj-mv.html pandas的set_value赋值方式 pandas set_value 弃用后的替代方式
用python从文件路径获取文件名
如何获取Dataframe的行数和列数
效果如图

Python 获取指定文件夹下的目录和文件
#读取目录下所有文件
import os
def print_list_dir(dir_path):
dir_files=os.listdir(dir_path) #得到该文件夹下所有的文件
for file in dir_files:
file_path=os.path.join(dir_path,file) #路径拼接成绝对路径
if os.path.isfile(file_path): #如果是文件,就打印这个文件路径
print(file_path)
if os.path.isdir(file_path): #如果目录,就递归子目录
print_list_dir(file_path)
if __name__ == '__main__':
dir_path='E:\\Reptile_Data\\数智教育数据集\\互联网用户行为日志数据集.rardataset_616718\\data\\behavior\\2012-05-07'
print_list_dir(dir_path)import pandas as pd
import re
import os
def txtfile_process(inpath,formatfile,outpath,index):
#确定文件格式
files = pd.read_csv(formatfile,index_col=0)
df = pd.DataFrame(files)
#f = open('data/behavior/2012-05-07/0AB6BBBEDFF24EC8BAAC905F45AE314C_2012-05-07_21-22-38.txt',encoding='utf-8')
f = open(inpath,encoding='utf-8')
#对文件名进行解析,获取用户id
filename=os.path.split(inpath)[1].split(".")[0]
strlist=filename.split('_')
USERID=strlist[0]
Time=strlist[1]+'_'+strlist[2]
#对文件内容进行处理
file=f.readlines()
pos=0
for i,line in enumerate(file):
if(i<2) :
continue
#统计有效行数
pos=pos+1
a = line.strip('\n')
a=a.replace('[=]','@')
a_lists=a.split("@")
for str in a_lists:
str=str.replace('<=>','@')
result=str.split("@")
name =result[0]
value =result[1]
df.at[i-2+index,name]=value
print(a)
rownum=df.shape[0]
for i in range(0,rownum):
df.at[i,'USERID']=USERID
df.at[i,'Time']=Time
df.to_csv(outpath)
#返回有效行数
return pos
inpath ='data/behavior/2012-05-07/0AB6BBBEDFF24EC8BAAC905F45AE314C_2012-05-07_21-22-38.txt'
formatfile ='new_data.csv'
outpath ='newss_data.csv'
txtfile_process(inpath,formatfile,outpath,0)效果如图

import pandas as pd
import re
import os
def txtfile_process(inpath,formatfile,outpath,index):
#确定文件格式
files = pd.read_csv(formatfile,index_col=0)
df = pd.DataFrame(files)
#f = open('data/behavior/2012-05-07/0AB6BBBEDFF24EC8BAAC905F45AE314C_2012-05-07_21-22-38.txt',encoding='utf-8')
f = open(inpath,encoding='utf-8')
#对文件名进行解析,获取用户id
filename=os.path.split(inpath)[1].split(".")[0]
strlist=filename.split('_')
USERID=strlist[0]
Time=strlist[1]+'_'+strlist[2]
#对文件内容进行处理
file=f.readlines()
pos=0
for i,line in enumerate(file):
if(i<2) :
continue
#统计有效行数
pos=pos+1
a = line.strip('\n')
a=a.replace('[=]','@')
a_lists=a.split("@")
for str in a_lists:
str=str.replace('<=>','@')
result=str.split("@")
name =result[0]
value =result[1]
df.at[i-2+index,name]=value
print(a)
rownum=df.shape[0]
for i in range(0,rownum):
df.at[i,'USERID']=USERID
df.at[i,'Time']=Time
df.to_csv(outpath)
#返回有效行数
return pos
#对该路径下的文件和目录进行遍历
def print_list_dir(dir_path):
dir_files=os.listdir(dir_path) #得到该文件夹下所有的文件
formatfile ='new_data.csv'
outpath ='newss_data.csv'
pos=0#定义当前位置
for file in dir_files:
file_path=os.path.join(dir_path,file) #路径拼接成绝对路径
if os.path.isfile(file_path): #如果是文件,就打印这个文件路径
pos=pos+txtfile_process(file_path,formatfile,outpath,pos)
if os.path.isdir(file_path): #如果目录,就递归子目录
print_list_dir(file_path)
if __name__ == '__main__':
dir_path='E:\\Reptile_Data\\数智教育数据集\\互联网用户行为日志数据集.rardataset_616718\\data\\behavior\\2012-05-07'
print_list_dir(dir_path)将不包含U字段的行全部删除,即不含 U<=> 的行
python 删除文本中的特定行
import os
def txt_delete_condition(inpath,outpath,str):
f = open(inpath,encoding='utf-8')
c=[]
file=f.readlines()
for i,line in enumerate(file):
if i<2 :
c.append(line)
continue
#a = line.strip('\n')
flag=True
if(line.find(strs)==-1):
flag=False
if flag==True:
c.append(line)
res="".join(c)
with open(outpath,'w') as f:
f.writelines(res)
inpath = "association\\2012-05-07\\0B9205B65DE6BAF09AE4AA49F37011A1_2012-05-07_09-03-53.txt"
strs="U<=>"
txt_delete_condition(inpath,inpath,strs)import os
def txt_delete_condition(inpath,outpath,strs):
f = open(inpath,encoding='utf-8')
c=[]
file=f.readlines()
for i,line in enumerate(file):
if i<2 :
c.append(line)
continue
flag=True
if(line.find(strs)==-1):
flag=False
if flag==True:
c.append(line)
res="".join(c)
with open(outpath,'w') as f:
f.writelines(res)
#读取目录下所有文件
import os
def print_list_dir(dir_path):
dir_files=os.listdir(dir_path) #得到该文件夹下所有的文件
strs="U<=>"
for file in dir_files:
file_path=os.path.join(dir_path,file) #路径拼接成绝对路径
if os.path.isfile(file_path): #如果是文件,就打印这个文件路径
#对所有文件进行处理
txt_delete_condition(file_path,file_path,strs)
if os.path.isdir(file_path): #如果目录,就递归子目录
print_list_dir(file_path)
if __name__ == '__main__':
dir_path='E:\\Reptile_Data\\数智教育数据集\\互联网用户行为日志数据集.rardataset_616718\\association\\2012-05-07'
print_list_dir(dir_path)效果 原来30MB大小变为15M左右
字段为用户id ,网页编号,以及网页链接
import pandas as pd
import re
import os
inpath ="association\\2012-05-07\\0B9205B65DE6BAF09AE4AA49F37011A1_2012-05-07_09-03-53.txt"
formatfile="connect.csv"
outpath="transtion.csv"
index=0
pos=0
#确定文件格式
files = pd.read_csv(formatfile)
df = pd.DataFrame(files)
f = open(inpath,encoding='utf-8')
#对文件名进行解析,获取用户id
filename=os.path.split(inpath)[1].split(".")[0]
strlist=filename.split('_')
USERID=strlist[0]
file=f.readlines()
for i,line in enumerate(file):
if(i<2) :
continue
#统计有效行数
pos=pos+1
a = line.strip('\n')
a=a.replace('[=]','@')
a_lists=a.split("@")
for str in a_lists:
str=str.replace('<=>','@')
result=str.split("@")
name =result[0]
value =result[1]
if name!='U':
continue
df.at[i-2+index,'Model']=value
df.at[i-2+index,'LineNumber']=i-1
print(a)
rownum=df.shape[0]
for i in range(index,rownum):
df.at[i,'USERID']=USERID
df.to_csv(outpath)
发现有的文本U字段的值为NULL,继续删除txt文本的行 即U<=>NULL的行
将文本二次处理时会报错

将编码encoding=‘utf-8’ 变为encoding='gbk’解决
import os
def txt_delete_condition(inpath,outpath,strs):
f = open(inpath,encoding='gbk')
c=[]
file=f.readlines()
for i,line in enumerate(file):
if i<2 :
c.append(line)
continue
flag=True
if(line.find(strs)!=-1):
flag=False
if flag==True:
c.append(line)
res="".join(c)
with open(outpath,'w') as f:
f.writelines(res)
#读取目录下所有文件
import os
def print_list_dir(dir_path):
dir_files=os.listdir(dir_path) #得到该文件夹下所有的文件
strs="U<=>NULL"
for file in dir_files:
file_path=os.path.join(dir_path,file) #路径拼接成绝对路径
if os.path.isfile(file_path): #如果是文件,就打印这个文件路径
#对所有文件进行处理
txt_delete_condition(file_path,file_path,strs)
if os.path.isdir(file_path): #如果目录,就递归子目录
print_list_dir(file_path)
if __name__ == '__main__':
dir_path='E:\\Reptile_Data\\数智教育数据集\\互联网用户行为日志数据集.rardataset_616718\\association\\2012-05-07'
print_list_dir(dir_path)import pandas as pd
import re
import os
def txt_conversion_csv(inpath,formatfile,outpath,index):
pos=0
#确定文件格式
files = pd.read_csv(formatfile)
df = pd.DataFrame(files)
f = open(inpath,encoding='gbk')
#对文件名进行解析,获取用户id
filename=os.path.split(inpath)[1].split(".")[0]
strlist=filename.split('_')
USERID=strlist[0]
file=f.readlines()
for i,line in enumerate(file):
if(i<2) :
continue
#统计有效行数
pos=pos+1
a = line.strip('\n')
a=a.replace('[=]','@')
a_lists=a.split("@")
for str in a_lists:
str=str.replace('<=>','@')
result=str.split("@")
name =result[0]
value =result[1]
if name!='U':
continue
df.at[i-2+index,'Model']=value
df.at[i-2+index,'LineNumber']=i-1
print(a)
rownum=df.shape[0]
for i in range(index,rownum):
df.at[i,'USERID']=USERID
df.to_csv(outpath)
return pos
inpath ="association\\2012-05-07\\0B9205B65DE6BAF09AE4AA49F37011A1_2012-05-07_09-03-53.txt"
formatfile="connect.csv"
outpath="transtion.csv"
index=0
txt_conversion_csv(inpath,formatfile,outpath,index)出现问题,字段访问越界,估计是U<=>后面出现了内容为空的情况
加一个代码判断切割列表元素的个数
str=str.replace('<=>','@')
result=str.split("@")
if len(result)!=2:
continue
name =result[0]
value =result[1]出现问题

解决该问题,并且限定读取内容,处理10000条内容大概35秒左右, 这大概和我使用函数式编程导致频繁打开关闭csv文件并重新写入有关
import pandas as pd
import re
import os
def txt_conversion_csv(inpath,formatfile,outpath,index):
pos=0
#确定文件格式
files = pd.read_csv(formatfile,index_col=0)
df = pd.DataFrame(files)
f = open(inpath,encoding='gbk')
#对文件名进行解析,获取用户id
filename=os.path.split(inpath)[1].split(".")[0]
strlist=filename.split('_')
USERID=strlist[0]
file=f.readlines()
for i,line in enumerate(file):
if(i<2) :
continue
#统计有效行数
pos=pos+1
a = line.strip('\n')
a=a.replace('[=]','@')
a_lists=a.split("@")
for str in a_lists:
str=str.replace('<=>','@')
result=str.split("@")
if len(result)!=2:
continue
name =result[0]
value =result[1]
if name!='U':
continue
df.at[i-2+index,'Model']=value
df.at[i-2+index,'LineNumber']=i-1
#print(a)
rownum=df.shape[0]
for i in range(index,rownum):
df.at[i,'USERID']=USERID
df.to_csv(outpath)
return pos
#对该路径下的文件和目录进行遍历
def print_list_dir(dir_path):
dir_files=os.listdir(dir_path) #得到该文件夹下所有的文件
formatfile ='connect.csv'
outpath ='transtion.csv'
pos=0#定义当前位置
for file in dir_files:
file_path=os.path.join(dir_path,file) #路径拼接成绝对路径
if os.path.isfile(file_path): #如果是文件,就打印这个文件路径
pos=pos+txt_conversion_csv(file_path,outpath,outpath,pos)
#给定结束条件
if pos>10000:
return 'break'
if os.path.isdir(file_path): #如果目录,就递归子目录
print_list_dir(file_path)
if __name__ == '__main__':
dir_path='E:\\Reptile_Data\\数智教育数据集\\互联网用户行为日志数据集.rardataset_616718\\association\\2012-05-07'
print_list_dir(dir_path)效果

优化内容如下,打开csv文件后不再关闭,防止频繁写入导致时间指数方式增长 结果: 效果不是很好,大概python内部进行了优化,10000条信息大概 默数62个数的时间
import pandas as pd
import re
import os
def txt_conversion_csv(inpath,formatfile,outpath,index):
pos=0
#确定文件格式
files = pd.read_csv(formatfile,index_col=0)
#isnan
df = pd.DataFrame(files)
f = open(inpath,encoding='gbk')
#对文件名进行解析,获取用户id
filename=os.path.split(inpath)[1].split(".")[0]
strlist=filename.split('_')
USERID=strlist[0]
file=f.readlines()
for i,line in enumerate(file):
if(i<2) :
continue
#统计有效行数
pos=pos+1
a = line.strip('\n')
a=a.replace('[=]','@')
a_lists=a.split("@")
for str in a_lists:
str=str.replace('<=>','@')
result=str.split("@")
if len(result)!=2:
continue
name =result[0]
value =result[1]
if name!='U':
continue
df.at[i-2+index,'Model']=value
df.at[i-2+index,'LineNumber']=i-1
#print(a)
rownum=df.shape[0]
for i in range(index,rownum):
df.at[i,'USERID']=USERID
df.to_csv(outpath)
return pos
#对该路径下的文件和目录进行遍历
def print_list_dir(dir_path):
dir_files=os.listdir(dir_path) #得到该文件夹下所有的文件
formatfile ='transtionnew.csv'
outpath ='transtionnew.csv'
#确定文件格式
files = pd.read_csv(formatfile,index_col=0)
df = pd.DataFrame(files)
pos=0#定义当前位置
for file in dir_files:
file_path=os.path.join(dir_path,file) #路径拼接成绝对路径
if os.path.isfile(file_path): #如果是文件,就打印这个文件路径
inpath=file_path
index=pos
f = open(inpath,encoding='gbk')
#对文件名进行解析,获取用户id
filename=os.path.split(inpath)[1].split(".")[0]
strlist=filename.split('_')
USERID=strlist[0]
file=f.readlines()
for i,line in enumerate(file):
if(i<2) :
continue
#统计有效行数
pos=pos+1
a = line.strip('\n')
a=a.replace('[=]','@')
a_lists=a.split("@")
for str in a_lists:
str=str.replace('<=>','@')
result=str.split("@")
if len(result)!=2:
continue
name =result[0]
value =result[1]
if name!='U':
continue
df.at[i-2+index,'Model']=value
df.at[i-2+index,'LineNumber']=i-1
#print(a)
rownum=df.shape[0]
for i in range(index,rownum):
df.at[i,'USERID']=USERID
#pos=pos+txt_conversion_csv(file_path,outpath,outpath,pos)
#给定结束条件
if pos>10000:
#写入数据
df.to_csv(outpath)
return 'break'
if os.path.isdir(file_path): #如果目录,就递归子目录
print_list_dir(file_path)
if __name__ == '__main__':
dir_path='E:\\Reptile_Data\\数智教育数据集\\互联网用户行为日志数据集.rardataset_616718\\association\\2012-05-07'
print_list_dir(dir_path)效果不是很好,大概python内部进行了优化,10000条信息大概 默数62个数的时间
域名相同的网址一定有联系
将网址进行处理,只保留域名,相同域名的网站一定是有联系的,我们不考虑他们是否有联系
网址文本文本处理
import pandas as pd
import re
import os
def url_process(strs,pattern):
try:
a=re.search(pattern,strs)
strs=a.group(0)
#print('匹配成功,结果为:',a.group(0))
except:#删除不能匹配的行
print("error")
return strs
#strs="http://user.qzone.qq.com/970593127/infocenter#!app=602"
strs="http://user.qzone.qq.cn/970593127/infocenter#!app=602"
pattern='([\S]+?\.(com|cn))'#提取的算式
strs=url_process(strs,pattern)
#处理结果输出
print(strs)
读取csv文件报错
将csv文件变为utf-8格式解决
import pandas as pd
import re
def url_process(strs,pattern):
try:
a=re.search(pattern,strs)
strs=a.group(0)
#print('匹配成功,结果为:',a.group(0))
except:#删除不能匹配的行
strs="NULL"
#print("error")
return strs
inpath="test.csv"
files = pd.read_csv(inpath,index_col=0)
df = pd.DataFrame(files)
pattern='([\S]+?\.(com|cn))'#提取域名
#数据处理
for i in range(0,len(df)):
strs = str(df['Model'][i])
strs = url_process(strs,pattern)
df['Model'][i]=strs
df.to_csv(inpath)效果如图

读入txt文件,并通过用户id奖励关联网页,类似于上课老师讲的购物篮,这里的用户id等同于订单编号
import pandas as pd
csv_data = pd.read_csv("test.csv")
#统计网站项
head_row =[]
for i in csv_data["Model"]:
if i not in head_row:
head_row.append(i)
#统计用户id
order_number =[]
for i in csv_data["USERID"]:
if i not in order_number:
order_number.append(i)
#新建—个以网站域名为列名,订单号为用户id的表格
new_table = pd.DataFrame(columns=head_row,index=order_number)#写内容
for j in csv_data.iterrows():
new_table.loc[j[1][0]][j[1][1]]=1
#数据写入csv文件
new_table.to_csv('test_new.csv', sep=',', header=True, index=True)
估计索引出现问题 ,删除最左侧的一列
之后出现问题

修改代码为
import pandas as pd
csv_data = pd.read_csv("test.csv")
#统计网站项
head_row =[]
for i in csv_data["Model"]:
if i not in head_row:
head_row.append(i)
#统计用户id
order_number =[]
for i in csv_data["USERID"]:
if i not in order_number:
order_number.append(i)
#新建—个以网站域名为列名,订单号为用户id的表格
new_table = pd.DataFrame(columns=head_row,index=order_number)#写内容
for j in csv_data.iterrows():
row_name=j[1][0]
col_name=j[1][2]
#print("{0} {1}".format(row_name,col_name))
new_table.loc[row_name][col_name]=1
#数据写入csv文件
new_table.to_csv('test_new.csv', sep=',', header=True, index=True)效果如下

将用户序列字段删除,仅保留关系 ,效果如下

Python3安装xlsxwriter
将csv文件转换excel的时候
在处理csv 文件的时候 经常需要转换未excel文件 但是csv 文件有时候并不适合用excel 打开 只要是分隔符 和换行符不符合 excel格式 ,就导致文件打开都是乱行
直接贴出代码来
import pandas as pd
import xlsxwriter
data_csv=pd.read_csv('./allProducts.csv',escapechar="\\",delimiter=";")
data_csv.to_excel('2112131.xlsx',sheet_name='data',engine='xlsxwriter')分析 为什么用xlsxwriter 因为pandas默认生成excel文件会有行数限制
因为读取的csv文件中字段值中包含 html代码 其中有转义双引号 所以必须设置 转义字符选项escapechar 分隔符 delimiter 根据csv文件里的分隔符设置 默认是逗号
四行代码 完成转换
作者:一个人独闯 链接:https://www.zhihu.com/question/57354476/answer/2214141333 来源:知乎
import pandas as pd
import xlsxwriter
data_csv=pd.read_csv('test_new.csv',escapechar="\\",delimiter=",")
data_csv.to_excel('2112131.xlsx',sheet_name='data',engine='xlsxwriter')转换结果如图

删除索引字段 ,效果如图

import pandas as pd
import re
import os
path1="test_new.csv"
file1 = pd.read_csv(path1,index_col=0)
file1 = pd.DataFrame(file1, dtype='float')
df1 = pd.DataFrame(file1)
outpath="test_newss.csv"
df1.to_csv(outpath)import pandas as pd
import xlsxwriter
data_csv=pd.read_csv('test_newss.csv',escapechar="\\",delimiter=",")
data_csv.to_excel('2112131.xlsx',sheet_name='data',engine='xlsxwriter')处理结果为无效
















