【问题标题】:How to combine horizontally many CSV files using python csv or pandas module?如何使用 python csv 或 pandas 模块水平组合多个 CSV 文件?
【发布时间】:2020-03-11 16:01:40
【问题描述】:

你好! 我想通过从每个文件中添加一列(在本例中称为“网格”列)将许多 CSV 文件(总数将在 120-150 左右波动)水平组合成一个 CSV 文件。所有这些文件都具有相同的列和行数(它们的构造相同)并存储在相同的目录中。我尝试过使用 CSV 模块和 pandas。我不想定义所有 120 个文件。我需要一个脚本来自动完成。我被困住了,我没有想法......

我想获取的一些输入 CSV 文件(数据)和 CSV 文件(合并): https://www.dropbox.com/transfer/AAAAAHClI5b6TPzcmW2dmuUBaX9zoSKYD1ZrFV87cFQIn3PARD9oiXQ

这就是我使用 CSV 模块时代码的样子:

import os
import glob
import csv

os.chdir('\csv_files_direction')

extension = 'csv'
files = [i for i in glob.glob('*.{}'.format(extension))]
out_merg = ('\merged_csv_file_direction')

with open(out_merg,'wt') as out:
    writer = csv.writer(out)
    for file in files:
        with open(file) as csvfile:
            data = csv.reader(csvfile, delimiter=';')
            result = []
            for row in data:
                a = row[3] #column which I need
                result.append(a)

使用此代码,我只接收来自最后一个 CSV 的值。其余的都不见了。因此,我希望目录中的每个 CSV 文件都有一个精确的列。

还有熊猫:

import os
import glob
import pandas as pd
import csv

os.chdir('\csv_files_direction')

extension = 'csv'
files = [i for i in glob.glob('*.{}'.format(extension))]
out_merg = ('\merged_csv_file_direction')
in_names = [pd.read_csv(f, delimiter=';', usecols = ['grid']) for f in files]

使用 pandas,我从所有 CSV 接收数据作为列表,可以使用例如 in_names[1] 进行导航。 我承认这是我第一次尝试 pandas,我不知道下一步该做什么。

我将非常感谢任何帮助! 提前致谢, 马特乌斯

【问题讨论】:

    标签: python pandas csv


    【解决方案1】:

    对于 CSV 部分,我认为您需要在循环之外定义另一个列表。 类似的东西

    import os
    import sys
    dirname = os.path.dirname(os.path.realpath('__file__'))
    import glob
    import csv
    
    
    extension = 'csv'
    files = [i for i in glob.glob('*.{}'.format(extension))]
    out_merg = ('merged_csv_file_direction')
    
    result= []
    with open(out_merg,'wt') as out:
        writer = csv.writer(out)
        for file in files:
            with open(file) as csvfile:
                data = csv.reader(csvfile, delimiter=';')
                col = []
                for row in data:
                    a = row[3] #column which I need
                    col.append(a)
                result.append((col))
    

    注意:我还更改了进入文件夹的方式。现在您可以在包含 2 个文件夹(一个用于获取数据,另一个用于保存数据)的文件夹中直接运行文件

    关于熊猫的角色 您可以再次创建一个循环。这次您需要 CONCAT 使用 in_names = [pd.read_csv(f, delimiter=';', usecols = ['grid']) for f in files] 创建的数据帧 我认为你可以使用

    import os
    import glob
    import pandas as pd
    import csv
    
    os.chdir('\csv_files_direction')
    
    extension = 'csv'
    files = [i for i in glob.glob('*.{}'.format(extension))]
    out_merg = ('\merged_csv_file_direction')
    in_names = [pd.read_csv(f, delimiter=';', usecols = ['grid']) for f in files]
    result = pd.concat(in_names)
    

    告诉我它是否有效

    【讨论】:

    • 嗨@ragioniere!第一个选项(使用 CSV)的结果并不是我想要收到的。列是水平保存的(一个在另一个之下)而不是垂直(一个在另一个旁边)。第二个选项(使用熊猫)没有给我任何结果。它只保存列的名称。
    • 您有什么想法如何转置列表或以另一种方式存储数据以保持 CSV 列的形状?
    • 对于 CSV 部分:这是因为我们使用列表来存储文件;打印时列表具有以下结构 [element1, element2, element3] 如果您需要将它们水平放置,这意味着您需要将文件保存在程序“外部”。我的问题是“在哪种文件中”?通过这种方式,我们可以找到“水平”在文件中“打印”列表的下一步。我想我误解了熊猫部分的问题。您需要像以前一样提取第三列吗?然后“转置”剩余的列使其水平?
    • 查看此链接。我想它会澄清我的意思。 dropbox.com/transfer/…
    • 现在CSV部分已经完成。现在列表由多个列表组成。所以最后,您将在结果中拥有 150 个元素,您可以将它们保存在 CSV 文件中。如果你需要 pandas 的部分,请告诉我
    猜你喜欢
    • 2015-05-23
    • 2019-10-20
    • 2011-04-28
    • 2017-11-05
    • 2019-02-22
    • 2018-06-11
    • 2020-06-08
    • 2022-01-10
    • 2018-02-14
    相关资源
    最近更新 更多