Python 如何将多个类似的.csv文件组合成一个具有给定结构的数据帧
我有许多结构相似的.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
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))
)