我在一个文件夹中有一个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)
答案 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