Python 从多个csv文件中获取一个特定列并合并为一个

Python 从多个csv文件中获取一个特定列并合并为一个,python,excel,loops,csv,pandas,Python,Excel,Loops,Csv,Pandas,我只想从所有csv文件中获取第4列中的数据,并将数据写入单个文件。每个第四列都有一个唯一的标题名,其中包含根文件夹的名称+csv名称,如FolderA1 福尔德拉/ 1.csv |INFO INFO INFO FolderA1 INFO Apple Apple Apple Orange Apple 2.csv |INFO INFO INFO FolderA2 INFO Apple Apple Apple Cracker Apple 3.csv

我只想从所有csv文件中获取第4列中的数据,并将数据写入单个文件。每个第四列都有一个唯一的标题名,其中包含根文件夹的名称+csv名称,如
FolderA1

福尔德拉/

1.csv |INFO  INFO  INFO  FolderA1  INFO
       Apple Apple Apple Orange    Apple

2.csv |INFO  INFO  INFO  FolderA2 INFO
       Apple Apple Apple Cracker  Apple

3.csv |INFO  INFO  INFO  FOLDERA3 INFO
       Apple Apple Apple Orange  Apple
如何将第四列数据过滤到单个
.xlsx
文件中,并将下一个文件夹csv放入新的工作表中,或将其与以前的文件夹csv分开

concentrated.xlsx | FOLDERA1 FOLDERA2 FOLDERA3   FOLDERB1 FOLDERB2 FOLDERB3
                    ORANGE   CRACKER   ORANGE    ORANGE   CRACKER  ORANGE

像这样的方法应该会奏效:

import pandas as pd

input_file_paths = ['1.csv', '2.csv', '3.csv']

dfs = (pd.read_csv(fname) for fname in input_file_paths)

master_df = pd.concat(
    (df[[c for c in df.columns if c.lower().startswith('folder')]]
        for df in dfs), axis=1)

master_df.to_excel('smth.xlsx')

df[[c for c in df.columns if c.lower().startswith('folder')]]
行的原因是,您的示例的文件夹列格式不一致。

类似的操作应该可以:

import pandas as pd

input_file_paths = ['1.csv', '2.csv', '3.csv']

dfs = (pd.read_csv(fname) for fname in input_file_paths)

master_df = pd.concat(
    (df[[c for c in df.columns if c.lower().startswith('folder')]]
        for df in dfs), axis=1)

master_df.to_excel('smth.xlsx')

df[[c for c in df.columns if c.lower().startswith('folder')]]
行的原因是,您的示例的文件夹列格式不一致。

我将使用
pandas.read\u csv
附带的
usecols
参数

def read_4th(fn):
    return pd.read_csv(fn, delim_whitespace=1, usecols=[3])

files = ['./1.csv', './2.csv', './3.csv']

big_df = pd.concat([read_4th(fn) for fn in files], axis=1)

big_df.to_excel('./mybigdf.xlsx')
对于多个文件夹,请使用
glob

假设您有两个文件夹“FolderA”和“FolderB”都位于文件夹“/”中,并且您希望所有csv文件都位于这两个文件夹中

from glob import glob

files = glob('./*/*.csv')

然后按照上面指定的方式运行其余部分。

我将使用
pandas.read\u csv
附带的
usecols
参数

def read_4th(fn):
    return pd.read_csv(fn, delim_whitespace=1, usecols=[3])

files = ['./1.csv', './2.csv', './3.csv']

big_df = pd.concat([read_4th(fn) for fn in files], axis=1)

big_df.to_excel('./mybigdf.xlsx')
对于多个文件夹,请使用
glob

假设您有两个文件夹“FolderA”和“FolderB”都位于文件夹“/”中,并且您希望所有csv文件都位于这两个文件夹中

from glob import glob

files = glob('./*/*.csv')

然后按照上面指定的方式运行其余部分。

其他答案建议将其作为一个选项使用,这肯定会起作用,但是如果您正在寻找一个纯粹使用Python库的解决方案,您可以尝试使用模块和迭代器

这里需要注意的是,根据需要连接的文件数量,可能会遇到内存限制。但撇开这一点不谈,这里有一种方法

基本Python库 通过使用生成器,您可以最大限度地减少一次加载到内存中的数据量,同时保持一种非常类似于python的解决方法


使用该模块可以更轻松地加载具有已知模式的多个文件,这似乎就是您的情况。可以用其他形式的文件查找来代替它,例如,如果它更合适的话。

其他答案建议将其作为一个选项使用,这当然会起作用,但是如果您正在寻找一个纯粹使用Python库的解决方案,您可以尝试使用模块和迭代器

这里需要注意的是,根据需要连接的文件数量,可能会遇到内存限制。但撇开这一点不谈,这里有一种方法

基本Python库 通过使用生成器,您可以最大限度地减少一次加载到内存中的数据量,同时保持一种非常类似于python的解决方法


使用该模块可以更轻松地加载具有已知模式的多个文件,这似乎就是您的情况。您可以用其他形式的文件查找来替换它,例如,如果它更合适的话。

脚本是否需要遍历多个文件夹?你只提到福尔德拉。是的,对不起,我没说清楚。它需要像FolderA 1,2,3.csv FolderB 1,2,3.csv那样运行,并且能够将其放入单个文件中。我做的for循环只能在一个文件夹中执行csv。每个文件夹只有3个csv文件吗?您似乎只提到每个文件夹3个。脚本是否需要遍历多个文件夹?你只提到福尔德拉。是的,对不起,我没说清楚。它需要像FolderA 1,2,3.csv FolderB 1,2,3.csv那样运行,并且能够将其放入单个文件中。我做的for循环只能在一个文件夹中执行csv。每个文件夹只有3个csv文件吗?您似乎只提到每个文件夹3个。谢谢,您的代码适用于一个文件夹。但是我怎样才能让它在其他文件夹中循环并添加到同一个xlsx中呢?也许为每个文件创建一个新的工作表或附加?您需要一种方法将文件名放入列表中。您可以使用
glob
库来执行此操作。我会在答案中加入一个例子。非常好的解决方案,我尝试了类似的方法,但忘记了分隔符,我找不到问题。;)谢谢,您的代码在一个文件夹中运行良好。但是我怎样才能让它在其他文件夹中循环并添加到同一个xlsx中呢?也许为每个文件创建一个新的工作表或附加?您需要一种方法将文件名放入列表中。您可以使用
glob
库来执行此操作。我会在答案中加入一个例子。非常好的解决方案,我尝试了类似的方法,但忘记了分隔符,我找不到问题。;)