Python 从多个csv文件中获取一个特定列并合并为一个
我只想从所有csv文件中获取第4列中的数据,并将数据写入单个文件。每个第四列都有一个唯一的标题名,其中包含根文件夹的名称+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
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
库来执行此操作。我会在答案中加入一个例子。非常好的解决方案,我尝试了类似的方法,但忘记了分隔符,我找不到问题。;)