在python中,如何根据头名称将数据从一个csv复制到另一个csv?
我有两个CSV文件,一个有特定的列和行,第二个只有一行有标题,第二个文件中的标题比第一个文件中的标题多,但包括第一个文件中的所有标题。 当第二个文件与第一个文件的头匹配时,我想填充第二个文件中的列。 第一个文件是原始数据文件,它有20列100000行,需要复制到有30列的工作文件中(20列与原始数据相同)。除列标题外,工作文件中也没有数据。 我可以用下面的代码复制数据,但它会更改列的顺序。我希望工作文件中的列顺序保持不变。 我对这门语言还很陌生,我真的很感激任何帮助 我现在使用的代码是:在python中,如何根据头名称将数据从一个csv复制到另一个csv?,python,csv,pandas,Python,Csv,Pandas,我有两个CSV文件,一个有特定的列和行,第二个只有一行有标题,第二个文件中的标题比第一个文件中的标题多,但包括第一个文件中的所有标题。 当第二个文件与第一个文件的头匹配时,我想填充第二个文件中的列。 第一个文件是原始数据文件,它有20列100000行,需要复制到有30列的工作文件中(20列与原始数据相同)。除列标题外,工作文件中也没有数据。 我可以用下面的代码复制数据,但它会更改列的顺序。我希望工作文件中的列顺序保持不变。 我对这门语言还很陌生,我真的很感激任何帮助 我现在使用的代码是: imp
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")
考虑数据帧
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: []
然后可以导出到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
熊猫是一种很好的工具,但在这里它的杀伤力太大了。csv模块就足够了,
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)
此算法允许添加数据,即使输出文件包含的数据超过标题行,并且可以处理大量数据,因为(除了文件缓冲区)内存中只保留一行。我很难理解您的问题。你能发布两个文件的内容和你想要的结果吗?我不知道我是否可以用office报告发布,但让我试着让它更清楚一点。我有两个文件,一个是带有特定列和值的原始数据,它有数字值和字母名称,另一个是我的工作文件,我将用这些原始数据进行所有分类。它只有标题。工作文件的头包含原始数据的所有头,我们必须手动从原始数据复制这些头。我想通过python复制这些值,同时保持工作文件中的列顺序。我有20多列和100000行,我可以写列,但不能键入值。请耐心听我说,因为我还在学习这门语言。谢谢你的帮助,我能够运行代码,它运行时没有任何错误,但它没有做任何事情。@AnkitSati:如果它没有达到预期效果,只需为以下内容添加跟踪打印:
outfile
,infielist
,然后在循环中找到了filename
。我没有您的文件夹;-)只有两个文件原始数据一个工作文件,工作文件被导出在您只有一个文件的情况下,为什么在一个文件夹中的所有csv文件上显示代码循环?对不起,这是为了预防万一我有多个文件,但结果是一个延伸。只有一个文件。我只需要在匹配列后将数据从原始复制到工作。
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)