有如下兩個文件
one.csv
列0, 列1, 列2, 列3
1, a, ww.ok;ww.ant;, anything
2, e, ww.kdi;, ihy
3, se, ww.sdd, sld
4, sd, ww.akd, sdjfa
two.csv
列0, 列1, 列2, 列3
1, sd, ww.ok;, 1245
2, 2e3, ww.kdi;, 432
3, de, ww.sdd;, 232
目標是先判斷one.csv列2是否包含two.csv文件列2,如果包含,則將two.csv列3的數(shù)據(jù)追加到one.csv對應行的末尾,最終結果效果如下:
result.csv
列0, 列1, 列2, 列3, 列4
1, a, ww.ok;ww.ant;, anything 1245
2, e, ww.kdi;, ihy 432
3, se, ww.sdd, sld 232
4, sd, ww.akd, sdjfa
自己寫了幾行代碼,一直卡在追加這一塊,因為實際要處理的數(shù)據(jù)量大,不像給出的樣本這樣,以one.csv為基礎遍歷,則比對的數(shù)據(jù)不全,以two.csv為基礎遍歷,則寫文件不知道如何進行。求前輩們指點。
import csv
import datetime
start = datetime.datetime.now()
with open('D:\one.csv') as one:
ic_rd = csv.reader(one)
next(ic_rd)
for i in ic_rd:
with open('D:\two.csv') as ga:
ga_rd = csv.reader(ga)
next(ga_rd)
for g in ga_rd:
if g[2] in i[2]:
i.append(g[2])
break
with open('D:\\result.csv','a+') as rs:
writer = csv.writer(rs)
writer.writerow(i)
end = datetime.datetime.now()
print (end-start)我新手上路,用正則表達式去根據(jù)你給出的例子的數(shù)據(jù)去匹配的,我是根據(jù)two給出的值去匹配one,所以前提是two.csv文件不能太大,我剛剛測試了一千萬條(大概500M左右,每一百條有一條匹配)的數(shù)據(jù)用了4分鐘,效率不是很高,程序是默認編碼,如果要轉碼效率可能會再差點,數(shù)據(jù)真是超大的話我覺得還是用c語言去寫工作效率會高點
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import re
import os
#用來匹配two.csv列2和列3的值
reg_list2 = re.compile(r'.+?,.+?,\s*(.+?)\s*[;]*\s*,\s*(\d+)\s*')
#用來匹配one.csv列2的值
reg_name = re.compile(r'.+?,.+?,\s*(.+?)\s*[;]*,')
#匹配頭
reg_title = re.compile(r'\s*\S+.+')
def main(argv):
try:
fptwo = open("two.csv", "r")
fpone = open("one.csv", "r")
fpnew = open("result.csv", "a")
except UnicodeDecodeError:
exit(1)
text = fptwo.read()
fptwo.close()
data_two = [(re.escape(x),n) for x,n in reg_list2.findall(text)]
otime = datetime.datetime.now()
title = None
new = "列4\n" #新列名字
tell = fpone.tell()
nu = 0
while True:
line = fpone.readline()
mate = reg_name.match(line)
if not title:
mate = reg_title.search(line)
if mate:
title = mate.group(0)
title = (title + ",").ljust(len(title)+15) + new
fpnew.write(title)
continue
if mate:
name = mate.group(1)
for item in data_two:
if re.search(item[0],name):
line = line[:-1]
line = (line + ",").ljust(len(title)) + item[1] + "\n"
print ("Pos L:", nu, "name: ", name)
fpnew.write(line)
nu += 1
if tell == fpone.tell():
break
else:
tell = fpone.tell()
fpone.close()
fpnew.close()
return 0
if __name__ == '__main__':
import sys
sys.exit(main(sys.argv))
# coding: utf-8
import pandas as pd
lst1 = [
[1, 'a', 'ww.ok;ww.ant', 'anything'],
[2, 'e', 'ww.kdi', 'ihy'],
[3, 'se', 'ww.sdd', 'sld'],
[4, 'sd', 'ww.akd', 'sdjfa']
]
lst2 = [
[1, 'sd', 'ww.ant', 1245],
[2,'2e3', 'ww.kdi', 432],
[3,'de', 'ww.sdd', 232]
]
df1 = pd.DataFrame(lst1, columns=['A1', 'B1', 'C1', 'D1'])
df2 = pd.DataFrame(lst2, columns=['A2', 'B2', 'C2', 'D2'])
#列拆成多行
df11 = df1.join(df1['C1'].str.split(';', expand=True).stack().reset_index(level=1, drop=True).rename('E'))
df22 = df2.join(df2['C2'].str.split(';', expand=True).stack().reset_index(level=1, drop=True).rename('E'))
#左連接, 并只取需要的字段
df3 = pd.merge(df11, df22, how='left', on='E').loc[:, ['A1', 'B1', 'C1', 'D1', 'D2']]
#去重
print df3.groupby(['A1', 'B1', 'C1', 'D1'], as_index=False).max()北大青鳥APTECH成立于1999年。依托北京大學優(yōu)質雄厚的教育資源和背景,秉承“教育改變生活”的發(fā)展理念,致力于培養(yǎng)中國IT技能型緊缺人才,是大數(shù)據(jù)專業(yè)的國家
達內教育集團成立于2002年,是一家由留學海歸創(chuàng)辦的高端職業(yè)教育培訓機構,是中國一站式人才培養(yǎng)平臺、一站式人才輸送平臺。2014年4月3日在美國成功上市,融資1
北大課工場是北京大學校辦產(chǎn)業(yè)為響應國家深化產(chǎn)教融合/校企合作的政策,積極推進“中國制造2025”,實現(xiàn)中華民族偉大復興的升級產(chǎn)業(yè)鏈。利用北京大學優(yōu)質教育資源及背
博為峰,中國職業(yè)人才培訓領域的先行者
曾工作于聯(lián)想擔任系統(tǒng)開發(fā)工程師,曾在博彥科技股份有限公司擔任項目經(jīng)理從事移動互聯(lián)網(wǎng)管理及研發(fā)工作,曾創(chuàng)辦藍懿科技有限責任公司從事總經(jīng)理職務負責iOS教學及管理工作。
浪潮集團項目經(jīng)理。精通Java與.NET 技術, 熟練的跨平臺面向對象開發(fā)經(jīng)驗,技術功底深厚。 授課風格 授課風格清新自然、條理清晰、主次分明、重點難點突出、引人入勝。
精通HTML5和CSS3;Javascript及主流js庫,具有快速界面開發(fā)的能力,對瀏覽器兼容性、前端性能優(yōu)化等有深入理解。精通網(wǎng)頁制作和網(wǎng)頁游戲開發(fā)。
具有10 年的Java 企業(yè)應用開發(fā)經(jīng)驗。曾經(jīng)歷任德國Software AG 技術顧問,美國Dachieve 系統(tǒng)架構師,美國AngelEngineers Inc. 系統(tǒng)架構師。