我是python的新手,我使用的是Python 3.9.6。我有大约48个不同的文件,所有文件的名称都是"Cam_Cantera_IDT_output_800K_*.csv“。例如: Cam_Cantera_IDT_output_800K_7401.csv和Cam_Cantera_IDT_output_800K_8012.csv。所有的文件都有一个时间列t,后面跟着许多名为X_oh,X_ch2,X_h20等的列。我想写一段代码,转到这48个文件中的每一个,只接受t和X_ch2列,并将它们保存在一个新文件中。由于所有48个文件的时间列都是相同的,所以我只需要1个时间列t后跟48列X_ch2,所以总共49列。
我的第一次尝试是使用append:
#Using .append, this code runs
import pandas as pd
import glob
require_cols = ['t', 'X_ch2']
all_data = pd.DataFrame()
for f in glob.glob("Cam_Cantera_IDT_output_800K_*.csv"):
df = pd.read_csv(f, usecols = require_cols)
all_data = all_data.append(df,ignore_index=True)
all_data.to_csv("new_combined_file.csv")这段代码运行了,但它将每个文件一个接一个地附加到另一个文件的下面,所以我只有两列,一列是t,一列是X_ch2,但是有很多行。我后来读到append就是这样做的,它将文件一个一个地添加到另一个文件下面。
然后,我尝试使用pd.concat将列垂直相邻地添加到一起。我使用的代码如下所示。不幸的是,我得到了与append相同的结果。我只得到了两列,一列是时间t,另一列是X_ch2,所有的文件都被添加到了彼此的下面。
#Attempting using pd.concat, this code runs
import glob
import pandas as pd
file_extension = 'Cam_Cantera_IDT_output_800K_*.csv'
all_filenames = [i for i in glob.glob(f"*{file_extension}")]
require_cols = ['t', 'X_ch2']
combined_csv_data = pd.concat([pd.read_csv(f, usecols = require_cols) for f in all_filenames], axis=0)
print(combined_csv_data)
combined_csv_data.to_csv('combined_csv_data.csv')我的最后一次尝试是使用pd.merge,我添加了on='t‘,以便将其合并到时间列上,因此我只有1个时间列。我不断得到错误,我错过了“正确”。但是当我将它添加到行中时,它告诉我没有定义权限:
combined_csv_data = pd.merge(right,pd.read_csv(f,usecols = require_cols) for f in all_filenames,on='t') =>给出'right‘未定义。
我尝试使用right_on = X_ch2或right_index=True,但似乎都不起作用。
我试过的原始代码,没有任何“正确”,如下所示。
# A merge attempt
#TypeError: merge() missing 1 required positional argument: 'right'
import glob
import pandas as pd
file_extension = 'Cam_Cantera_IDT_output_800K_*.csv'
all_filenames = [i for i in glob.glob(f"*{file_extension}")]
require_cols = ['t', 'X_ch2']
combined_csv_data = pd.merge([pd.read_csv(f, usecols = require_cols) for f in all_filenames], on='t')
print(combined_csv_data)
combined_csv_data.to_csv('combined_csv_data.csv')任何帮助都将不胜感激,谢谢。
发布于 2021-12-02 06:20:56
在concat中使用axis=1并将t列转换为index,为Series选择列X_ch2
require_cols = ['t', 'X_ch2']
L = [pd.read_csv(f,usecols = require_cols, index_col=['t'])['X_ch2'] for f in all_filenames]
combined_csv_data = pd.concat(L, axis=1)如果需要列名称,请按文件名重命名,以避免重复的48列名称:
import os
L = [pd.read_csv(f,
usecols = require_cols,
index_col=['t'])['X_ch2'].rename(os.path.basename(f))
for f in all_filenames]发布于 2021-12-02 09:28:15
如果可以选择安装convtools库,则:
import glob
from convtools import conversion as c
from convtools.contrib.tables import Table
required_cols = ["t", "X_ch2"]
table = None
for number, f in enumerate(glob.glob("Cam_Cantera_IDT_output_800K_*.csv")):
table_ = (
Table.from_csv(f, header=True)
.take(*required_cols)
.rename({"X_ch2": f"X_ch2__{number}"})
)
if table is None:
table = table_
else:
table = table.join(table_, on="t", how="full")
table.into_csv("new_combined_file.csv", include_header=True)https://stackoverflow.com/questions/70194923
复制相似问题