【问题标题】:How to save specific columns from different files into one file如何将不同文件中的特定列保存到一个文件中
【发布时间】:2021-12-02 17:28:15
【问题描述】:

我是 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 个列。

我的第一次尝试是使用追加:

#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")

这段代码运行了,但是它将每个文件一个附加到另一个下面,所以我只有 2 列,一列用于 t,一列用于 X_ch2,但有很多行。后来我读到这就是 append 的作用,它将文件添加到另一个之下。

然后我尝试使用 pd.concat 将列垂直添加到彼此旁边。我使用的代码如下所示。不幸的是,我得到了与 append 相同的结果。我只有 2 列,一列用于时间 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')

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

【问题讨论】:

    标签: python pandas


    【解决方案1】:

    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]
    

    【讨论】:

    • 感谢您的回复。两种选择都有效,谢谢。弹出的唯一问题是一堆 NaN,它们看起来像我的 csv 文件中的空单元格。我该如何解决这个问题?另外,我想将我的列命名为 X_ch2_“每个文件名中的最后一个数字”,所以 X_ch2_2027、X_ch2_3056,关于如何实现这一点的任何想法?谢谢
    【解决方案2】:

    如果安装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)
    
    

    【讨论】:

    • 感谢您的回复。我会考虑下载 convtools。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多