首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何将不同文件中的特定列保存到一个文件中

如何将不同文件中的特定列保存到一个文件中
EN

Stack Overflow用户
提问于 2021-12-02 06:16:28
回答 2查看 45关注 0票数 0

我是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:

代码语言:javascript
复制
#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,所有的文件都被添加到了彼此的下面。

代码语言:javascript
复制
#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,但似乎都不起作用。

我试过的原始代码,没有任何“正确”,如下所示。

代码语言:javascript
复制
# 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')

任何帮助都将不胜感激,谢谢。

EN

回答 2

Stack Overflow用户

发布于 2021-12-02 06:20:56

concat中使用axis=1并将t列转换为index,为Series选择列X_ch2

代码语言:javascript
复制
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列名称:

代码语言:javascript
复制
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]
票数 0
EN

Stack Overflow用户

发布于 2021-12-02 09:28:15

如果可以选择安装convtools库,则:

代码语言:javascript
复制
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)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70194923

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档