我有两个CSV文件,一个包含某些列和行,第二个只有一行包含标题,第二个文件中的标题包含的标题多于第一个,但包含第一个文件中的所有标题。 我想在匹配第一个文件的标题时填充第二个文件中的列。 第一个文件是一个原始数据文件,它有20列,100,000行需要复制到具有30列的工作文件(20列与原始列相同)。除列标题外,工作文件中也没有数据。 我能够使用下面的代码复制数据,但它改变了列的顺序。我希望工作文件中的列序列保持不变。 我对这门语言很陌生,我真的很感激任何帮助。
我现在使用的代码是:
import os
import glob
import pandas as pd
def concatenate(indir = "", outfile = "",outdf=""):
os.chdir(indir)
fileList=glob.glob("*.csv")
dfList=[]
for fileName in fileList:
print(fileName)
df=pd.read_csv(fileName,low_memory=False)
dfList.append(df)
concatdf=pd.concat(dfList, axis=0)
concatdf.to_csv(outfile, index=False)
concatenate(indir = "xyz.csv", outfile = "abc.csv")
答案 0 :(得分:1)
考虑数据框abc
和xyz
xyz = pd.DataFrame(dict(a=[1, 2, 3], b=[1, 2, 3], c=[1, 2, 3], d=[1, 2, 3]))
abc = pd.DataFrame(columns=list('artbnckld'))
xyz
a b c d
0 1 1 1 1
1 2 2 2 2
2 3 3 3 3
abc
Empty DataFrame
Columns: [a, r, t, b, n, c, k, l, d]
Index: []
abc.append(xyz)[abc.columns.tolist()]
a r t b n c k l d
0 1.0 NaN NaN 1.0 NaN 1.0 NaN NaN 1.0
1 2.0 NaN NaN 2.0 NaN 2.0 NaN NaN 2.0
2 3.0 NaN NaN 3.0 NaN 3.0 NaN NaN 3.0
然后您可以导出到csv文件
abc.append(xyz)[abc.columns.tolist()].to_csv()
,a,r,t,b,n,c,k,l,d
0,1.0,,,1.0,,1.0,,,1.0
1,2.0,,,2.0,,2.0,,,2.0
2,3.0,,,3.0,,3.0,,,3.0
答案 1 :(得分:0)
DictReader
和DictWriter
可以自动执行您需要的操作:
假设:
输入:
输出:
可能的代码:
def populate(outfile, infilelist)
# First of all read output file field names:
with open(outfile) as fd:
rd = csv.DictReader(fd)
names = rd.fieldnames
# Reopen output file in append mode to populate if from the files of infilelist
with open(outfile, "a") as fdout:
wr = csvDictWriter(fdout, fieldnames = names)
# loop over the input files:
for filename in infilelist:
with open(filename) as fd:
rd = csv.DictReader(fd)
# simply copy the rows, one at a time
for row in rd:
wr.writerow(row)
即使输出文件包含更多的标题行,此算法也允许添加数据,并且可以处理大量数据,因为(除文件缓冲区外)只有一行保留在内存中。