如何从文件夹中的多个csv文件创建一个数据框

时间:2017-11-26 03:17:42

标签: python r dataframe concatenation

我在一个文件夹中有一个CSV文件列表(A1.csv,A2.csv ........ D10.csv),其中包含两列但多行的数据。基本上,我想从所有csv文件中提取最后一行和第二列的值 See the picture to understand better

并创建一个数据框,其中包含第一列中的文件名和第二列中的提取值(C)。

现在,我可以通过创建另一个CSV文件列表并稍后将它们连接到一个数据框来实现。

是否可以将CSV文件生成的每个数据帧存储到列表中,然后将它们连接起来(r中的rbind做什么)。我在R中尝试了这个代码,它有效。但我想在R或python中学习更有效的方法。(Python更可取,因为我正在尝试学习python)

#read through csv files and select the last row 2nd column
m=c(NULL)
aa=c(NULL)
f=list.files(path = getwd(),pattern = '.*csv')
for (g in f){
aa=read.csv(g)
m=tail(aa,1)
q=m[,2]
yy=data.frame(ID=g,Final=q)
write.csv(yy,file = paste("Filename/",g),row.names = F)
}
###concatanate into one file
readFile=list.files(path = getwd(),pattern = "*.csv")
Alldata=lapply(readFile,function(filename){
dummy=read.csv(filename)
return(dummy)
})
FinalFIle=do.call(rbind,Alldata)
write.csv(FinalFIle,file = "FinalFIle.csv",row.names = F)

4 个答案:

答案 0 :(得分:3)

这是R。

中的一个选项

步骤1:准备带有文件名的向量。如果文件夹中的文件太多,则list.files功能可能很有用。在这里,我只是手动创建它。我还假设所有文件都存储在工作目录中。否则,您将需要构造文件路径。

file_vec <- c("A1.csv", "A2.csv", "A3.csv")

步骤2:根据file_vec读取所有CSV文件。关键是使用lapply函数应用read.csv中每个元素的file_vec

dt_list <- lapply(file_vec, read.csv, stringsAsFactors = FALSE)

步骤3:准备一个显示没有.csv

的文件名的向量
name_vec <- sub(".csv", "", file_vec)

步骤4:创建数据框。 x[nrow(x), 2]是一种访问第二列最后一个值的方法。

dt_final <- data.frame(File = name_vec,
                       Value = sapply(dt_list, function(x) x[nrow(x), 2]),
                       stringsAsFactors = FALSE)

dt_final是最终输出。

答案 1 :(得分:3)

这是使用R中的tidyverse的另一个选项:

library(tidyverse)

# In my example, I'm using a folder with 4 Chicago Crime Datasets
setwd("INSERT/PATH/HERE")

files <- list.files()

tibble(files) %>%
  mutate(file_contents = map(files, ~ read_csv(file.path(.), n_max = 10))) %>% 
  unnest(file_contents) %>%
  group_by(files) %>%
  slice(n()) %>% 
  select(1:2)

返回:

# A tibble: 4 x 2
# Groups:   filename [4]
                         filename    X1
                            <chr> <int>
1 Chicago_Crimes_2001_to_2004.csv  4904
2 Chicago_Crimes_2005_to_2007.csv    10
3 Chicago_Crimes_2008_to_2011.csv  5867
4 Chicago_Crimes_2012_to_2017.csv  1891

请注意,不需要n_max = 10参数。我只包括这个,因为我正在使用的文件非常大。

对于任何感兴趣的人,可以找到数据集here

此外,您可能希望避免使用setwd()设置工作目录。如果是这种情况,您可以在full.names = TRUE中使用附加参数list.files()

path <- "INSERT/PATH/HERE"
files <- list.files(path, full.names = TRUE)

我推荐这种方法,因为包含行setwd()的脚本不灵活,路径会因用户而异。

答案 2 :(得分:1)

Python解决方案

>>> import pandas as pd
>>> files = ['A1.csv', 'A2.csv', ... , 'D10.csv']
>>> df_final = pd.Dataframe({fname: pd.read_csv(fname).iat[-1, 1] for fname in files})

答案 3 :(得分:0)

对于bash和朋友来说,这是一个简单的案例。这个单线

for i in A*.csv B*.csv C*.csv D*.csv; do awk -F , 'END{ print $NF }' "$i"; done

提取右下角字段,无论有多少行或列,都遵循您提供的模式的任意数量的文件。如果所有文件都在一个文件夹中,并且它们是该文件夹中唯一的.csv文件,并且您希望将结果保存在新文件中,则可以完成此任务:

for i in *.csv; do awk -F , 'END{ print $NF }' "$i"; done > extract.txt