R语言 合并十个CSV文件,不重复第一列

jfgube3f  于 2023-04-03  发布在  其他
关注(0)|答案(3)|浏览(172)

我有两个不同的CSV文件。它们每个都有两列。文件中的第一列总是相同的。我需要一个python或R代码将这些CVS文件合并为一个,而不复制第一列。所以,最终,合并的CSV文件应该有11列。

我想这样做:
我有这些文件:
file1.CSV,包含两列A和B
包含A和C两列的file2.CSV
最终输出:
file3.CSV,包含三列A、B和C

我想这样做:

File 1: Input
A         B 
2007-1    100  
2007-1    4   
2007-1    30  
2007-1    22   
2007-1    13   
2007-1    12   

File 2: Input
A         B
2007-1    33  
2007-1    56   
2007-1    34  
2007-1    3   
2007-1    55   
2007-1    68   

Desire output
A         B     C
2007-1    33    100
2007-1    56    4
2007-1    34    30
2007-1    3     22
2007-1    55    13
2007-1    68    12
iibxawm4

iibxawm41#

也许我在R中有解决方案,使用tidyverse和data.table包。
要使代码正常工作,您需要创建一个仅包含.csv文件的文件夹。

library(tidyverse)
library(data.table)

file_names<-list.files("path/to/your/")

df_list=file_names%>% map(~{
  return(fread(paste0("path/to/your/",.x),colClasses = 'character'))
}) 

df= df_list %>% purrr::reduce(dplyr::left_join, by = 'First_col_name')

fwrite(df,'path/to/your/merged_csv_file.csv')

希望能有所帮助!

tez616oj

tez616oj2#

在R中,类似下面的代码可以工作。未经测试,因为没有数据。

csv_filenames <- c('path/to/your/first_csv_file.csv', 
                   'path/to/your/second_csv_file.csv')
df_list <- lapply(csv_filenames, read.csv)

在阅读数据到一个data.frames列表中后,使用发布的数据Reduce/merge将给予以下data. frames的笛卡尔积。

Reduce(\(x, y) merge(x, y, by = "A"), df_list)
#>         A   B  C
#> 1  2007-1 100 33
#> 2  2007-1 100 56
#> 3  2007-1 100 34
#> 4  2007-1 100  3
#> 5  2007-1 100 55
#> 6  2007-1 100 68
#> 7  2007-1   4 33
#> 8  2007-1   4 56
#> 9  2007-1   4 34
#> 10 2007-1   4  3
#> 11 2007-1   4 55
#> 12 2007-1   4 68
#> 13 2007-1  30 33
#> 14 2007-1  30 56
#> 15 2007-1  30 34
#> 16 2007-1  30  3
#> 17 2007-1  30 55
#> 18 2007-1  30 68
#> 19 2007-1  22 33
#> 20 2007-1  22 56
#> 21 2007-1  22 34
#> 22 2007-1  22  3
#> 23 2007-1  22 55
#> 24 2007-1  22 68
#> 25 2007-1  13 33
#> 26 2007-1  13 56
#> 27 2007-1  13 34
#> 28 2007-1  13  3
#> 29 2007-1  13 55
#> 30 2007-1  13 68
#> 31 2007-1  12 33
#> 32 2007-1  12 56
#> 33 2007-1  12 34
#> 34 2007-1  12  3
#> 35 2007-1  12 55
#> 36 2007-1  12 68

创建于2023-03-29带有reprex v2.0.2
merge的另一个选项是首先创建一个id列,将行名称分配给它,然后通过两列连接数据,新创建的一列和"A"列。

df_list <- lapply(df_list, \(x) {
  x$id <- row.names(x)
  x[c(3, 1, 2)]
})
Reduce(\(x, y) merge(x, y), df_list)[-1]
#>        A   B  C
#> 1 2007-1 100 33
#> 2 2007-1   4 56
#> 3 2007-1  30 34
#> 4 2007-1  22  3
#> 5 2007-1  13 55
#> 6 2007-1  12 68

创建于2023-03-29带有reprex v2.0.2

编辑

也许所需的合并操作实际上是按列绑定,删除第2个 Dataframe 的第一列,等等,以便不重复列"A"

Reduce(\(x, y) cbind(x, y[-1]), df_list)
#>        A   B  C
#> 1 2007-1 100 33
#> 2 2007-1   4 56
#> 3 2007-1  30 34
#> 4 2007-1  22  3
#> 5 2007-1  13 55
#> 6 2007-1  12 68

创建于2023-03-29带有reprex v2.0.2

afdcj2ne

afdcj2ne3#

一个简单的方法来实现这一点将是追加所有csv文件,然后删除重复(假设列名相同,例如:时间戳),同时保持第一列。

from google.colab import drive
 drive.mount('/content/drive')
 #create a folder and name it csv-merge
 #add your csv files in it
 %cd '/content/drive/My Drive/csv-merge/'

 import glob
 # list all csv files only
 csv_files = glob.glob('*.{}'.format('csv'))
 print(csv_files) #this will list out all the csv files
 >>output : ['file1.csv', 'file2.csv']

 import pandas as pd 
 df_csv_append = pd.DataFrame() 
 #append the CSV files
 for file in csv_files:
     df = pd.read_csv(file)
     df_csv_append = df_csv_append.append(df, ignore_index=True)
     df_csv_append
      df_csv_append.to_csv('appended.csv')
      #df = df.drop_duplicates('column_name', keep='last')`

相关问题