python - 如何将几个类似的 .csv 文件合并到一个具有给定结构的数据框中

标签 python r csv dataframe

我有很多结构相似的 .csv 文件:

1.csv

Type n
A   1
B   20
C   34
D   5
...

2.csv

Type n
A   2
B   15
C   16
D   5
...

我想将它们组合成类似的东西:

Type  n1   n2
  A   1    2
  B   20   15
  C   34   16
  D   5    5
  ...

当我使用 lapply 时,我得到了

 Type n  Type   n
  A   1    A    2
  B   20   B    15
  C   34   C    16
  D   5    D    5
  ...

有什么简单的方法可以正确组合它们吗?

我愿意接受 R 或 Python 中的解决方案

最佳答案

解释一:每个CSV的数据结构相同

如果结构相同,这里有两个选项可供考虑,但首先是一些样本数据:

cat("Type n", "A  1", "B  20", "C  34", "D  5", sep = "\n", file = "myfile1.txt")
cat("Type n", "A  2", "B  15", "C  16", "D  5", sep = "\n", file = "myfile2.txt")

选项 1:通过使用 "NULL"(带引号)作为需要的列的 colClasses,在读取数据时删除第一列被丢弃。使用 cbind 将文件放在一起。

x <- read.table("myfile1.txt", header=TRUE)
y <- read.table("myfile2.txt", header=TRUE, colClasses=c("NULL", "numeric"))
cbind(x, y)
#   Type  n  n
# 1    A  1  2
# 2    B 20 15
# 3    C 34 16
# 4    D  5  5

## For more files:
## do.call(cbind, list(x, y, ...))

选项 2:正常读取文件,然后使用 c(FALSE, TRUE) 向量子集,将所有内容放入 listcbind 以及任何对象的第一列。

x1 <- read.table("myfile1.txt", header = TRUE)
y1 <- read.table("myfile2.txt", header = TRUE)

fileList <- list(x1, y1)
cbind(x1[1], do.call(cbind, fileList)[c(FALSE, TRUE)])
#   Type  n n.1
# 1    A  1   2
# 2    B 20  15
# 3    C 34  16
# 4    D  5   5

当然,以上只是最小的例子。我假设您实际上在每个文件中有超过 2 列。使用与您的列实际匹配的 TRUEFALSE 的向量以保留和删除(分别)第二个选项,以及 “NULL” 和第一个选项的对象类。


解读2:每个CSV的相似数据结构

如果数据结构相似但不相同,您可能需要改用merge。考虑以下示例数据。前三个文件具有相同的结构,但第四个文件 “myfile4.txt” 的“Type”值是 A、B、D 和 E,而其他三个文件的“Type”值是“A” 、“B”、“C”和“D”

cat("Type n", "A  1", "B  20", "C  34", "D  5", sep = "\n", file = "myfile1.txt")
cat("Type n", "A  2", "B  15", "C  16", "D  5", sep = "\n", file = "myfile2.txt")
cat("Type n", "A  1", "B   5", "C   6", "D  7", sep = "\n", file = "myfile3.txt")
cat("Type n", "A  8", "B   9", "D  11", "E  0", sep = "\n", file = "myfile4.txt")

下面是我们如何解决这个问题。

  1. 批量读入文件:

    x <- list.files(pattern="myfile")
    y <- lapply(x, read.table, header = TRUE)
    
  2. 多个merge如果不能生成唯一的名称可能会导致错误。通过为开始的非 ID 列创建唯一名称来帮助合并

    library(data.table) ## for `setnames`
    ## setnames will silently assign new names 
    ##   to the original data in list "y"
    invisible(lapply(seq_along(y), function(z) 
      setnames(y[[z]], "n", paste("n", z, sep = "_"))))
    
  3. 使用 Reduce 将“类型”列用作“id”来合并列表项。

    Reduce(function(x, y) merge(x, y, by = "Type", all = TRUE), y)
    #   Type n_1 n_2 n_3 n_4
    # 1    A   1   2   1   8
    # 2    B  20  15   5   9
    # 3    C  34  16   6  NA
    # 4    D   5   5   7  11
    # 5    E  NA  NA  NA   0
    

关于python - 如何将几个类似的 .csv 文件合并到一个具有给定结构的数据框中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19246831/

相关文章:

r - 如何在迷宫中找到最短路线?

r - 用于删除所有包含 R 中数字的单词的正则表达式

python - 相关对象不存在 : User has no userprofile

python - 我如何更好地处理涉及Unicode字符以及从ASCII来回往返的编码和解码

python - 如何在 Jinja 中迭代整型变量?

r - 在 lapply 中使用 .Call 导致 R 的结果不一致

PHP 导入带有变音符号的 CSV

java - 加快在 Java 中读取 CSV

python - 解决 CSV 中无效行的问题

python - 如何在 Flask-SocketIO 中向测试客户端推送通知?