循环通过文件夹中的csv文件,一次添加一个文件的列

bvhaajcl  于 2023-05-20  发布在  其他
关注(0)|答案(1)|浏览(301)

我的代码能够循环通过文件夹,但现在它的硬编码做一个csv。我希望循环遍历文件夹中的所有csv,并将列添加到每个csv中。

import numpy as np
import pandas as pd
import glob
test_miti_files = glob.glob('test_miti/*.csv', recursive=True)
all_test_miti_files = []

path = "C:/Users/j/Desktop/*.csv"
for file in glob.glob(path):
    df = pd.read_csv(file, usecols=["ID"]).set_axis(["ID"], axis=1)
    all_test_miti_files.append(df)
test_miti_files_result = pd.concat(all_test_miti_files, axis=0, ignore_index=True)
out = pd.merge(file, test_miti_files_result, left_on="ID", right_on="ID", how="left")
csv1 = pd.merge(file,test_miti_files_result[['ID']].assign(**{'test_miti_Flag': test_miti_files_result.ID}), on='ID', how='left')
csv1.to_csv(file + "test", sep=",", index=False, na_rep="N/A")

将我的代码更新为如下所示

import pandas as pd
import glob
test_miti_files = glob.glob('test_miti/*.csv', recursive=True)
all_test_miti_files = []

path = "C:/Users/j/Desktop/*.csv"
for file in glob.glob(path):
    df = pd.read_csv(file, usecols=["ID"]).set_axis(["ID"], axis=1)
    all_test_miti_files.append(df)
    test_miti_files_result = pd.concat(all_test_miti_files, axis=0, ignore_index=True)
    out = pd.merge(file, test_miti_files_result, left_on="ID", right_on="ID", how="left")
    csv1 = pd.merge(file,test_miti_files_result[['ID']].assign(**{'test_miti_Flag': test_miti_files_result.ID}), on='ID', how='left')
    df.to_csv(file + "_wider", sep=",", index=False, na_rep="N/A")

但现在我得到了这个错误。

TypeError: Can only merge Series or DataFrame objects, a <class 'str'> was passed

out = pd.merge线上。有什么建议吗

gijlo24d

gijlo24d1#

您正在循环文件,但随后将所有CSV数据合并到单个 Dataframe 中。然后,你在循环外添加一个列,并将其写入一个文件,所以现在你有一个CSV文件,其中包含目录中所有原始文件的数据,还有一个额外的列。
你想要的是这样的东西:

for file in glob.glob(path):
    df = pd.read_csv(file, usecols=["ID"]).set_axis(["ID"], axis=1)
    //code to add column to "df" goes here
    df.to_csv(file + "_wider", sep=",", index=False, na_rep="N/A")

这将创建一个新的CSV,并使用不同的名称(即具有额外列的data1.csv将被写入data1_wider.csv,data2.csv将被写入data2_wider.csv,等等)。如果你想覆盖这个文件,你可以只给予相同的文件名。

相关问题