Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何将多个类似的.csv文件组合成一个具有给定结构的数据帧_Python_R_Csv_Dataframe - Fatal编程技术网

Python 如何将多个类似的.csv文件组合成一个具有给定结构的数据帧

Python 如何将多个类似的.csv文件组合成一个具有给定结构的数据帧,python,r,csv,dataframe,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 ... 当我使用lappy时,我得到 Type n Type n A 1 A 2

我有许多结构相似的.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
  ...
当我使用lappy时,我得到

 Type n  Type   n
  A   1    A    2
  B   20   B    15
  C   34   C    16
  D   5    D    5
  ...
有没有简单的方法将它们正确地结合起来

我对R或Python中的解决方案持开放态度,您可以使用Python执行以下操作:

import pandas as pd

df1 = pd.read_csv('1.csv', sep='\s+', index_col=0)
df2 = pd.read_csv('2.csv', sep='\s+', index_col=0)

pd.concat([df1, df2], axis=1)
Out[16]: 
       n   n
Type        
A      1   2
B     20  15
C     34  16
D      5   5
如果您希望更多的自动列重命名:

pd.merge(df1, df2, left_index=True, right_index=True, suffixes=['1', '2'])
Out[20]: 
      n1  n2
Type        
A      1   2
B     20  15
C     34  16
D      5   5
解释1:每个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, ...))
当然,以上只是一些小例子。我假设每个文件中实际上有两列以上。对于第二个选项,使用与列实际匹配的
TRUE
s和
FALSE
s向量分别保留和删除,对于第一个选项,使用
“NULL”
和对象类


解释2:每个CSV的类似数据结构 如果数据结构相似但不相同,则可能需要使用
merge
。考虑下面的样本数据。前三个文件具有相同的结构,但第四个文件,
“myfile4.txt”
具有A、B、D和E作为“类型”值,而其他三个文件具有“A”、“B”、“C”和“D”

下面是我们可以解决这个问题的方法

  • 大容量读取文件:

    x <- list.files(pattern="myfile")
    y <- lapply(x, read.table, header = TRUE)
    
  • 使用
    Reduce
    将列表项合并到一起,使用“Type”列作为“id”


  • 这里的另一个解决方案假设不需要进行合并。例如,如果您有三个文件,您可以这样读取它们:

    n <- 1:3
    x <- lapply(sprintf('%s.csv', n), read.csv)
    
    或者,如果您确实希望名称的格式为
    n1
    n2
    等:

    data.frame(
      Type = x[[1]]$Type, 
      setNames(lapply(x, '[[', -1), paste0('n', n))
    )
    

    它们在结构上是相似的,还是相同的。如果类似,则可能需要
    合并
    匹配
    。如果相同,一个简单的
    cbind
    应该可以做到这一点(在R中)。当
    cbind
    ing时,从除第一个文件以外的所有文件中删除第一列,并使用
    make.names
    paste
    为“n”列获取唯一的名称。可能您想要类似
    merge
    的内容,可能与
    do.call组合使用
    merge
    甚至没有提及?差的
    合并
    。这不是错,这没有cbind那么有效。它做的很好。我刚才看到了你的评论。是否值得在你的答案中加入,以备将来搜索?@Ricardosporta,merge incorporated。我觉得在R/SO世界中,有很多人出于小/无理由而投了反对票。
    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 = "_"))))
    
    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
    
    n <- 1:3
    x <- lapply(sprintf('%s.csv', n), read.csv)
    
    data.frame(Type = x[[1]]$Type, sapply(x, '[[', -1))
    
    data.frame(
      Type = x[[1]]$Type, 
      setNames(lapply(x, '[[', -1), paste0('n', n))
    )