【问题标题】:Merge multiple CSV files that share 2 columns into one unique data frame将共享 2 列的多个 CSV 文件合并到一个唯一的数据框中
【发布时间】:2020-06-28 01:44:14
【问题描述】:

我在一个文件夹中有多个 CSV 文件(例如 200 个),我想将它们合并到一个唯一的数据框中。例如,每个文件有 3 列,其中 2 列在所有文件中是通用的(CountryYear),第三列在每个文件中是不同的。

例如,一个文件具有以下列:

Country  Year    X 
----------------------
Mexico   2015    10
Spain    2014    6

其他文件可以是这样的:

Country  Year    A
--------------------
Mexico   2015    90
Spain    2014    67
USA      2020    8

我可以读取这些文件并将它们与以下代码合并:

x = pd.read_csv("x.csv")
a = pd.read_csv("a.csv")
df = pd.merge(a, x, how="left", left_on=["country", "year"], 
                right_on=["country", "year"], indicator=False)

这会产生我想要的输出,如下所示:

Country  Year    A    X
-------------------------
Mexico   2015    90   10
Spain    2014    67   6
USA      2020    8

但是,我的问题是对每个文件做前面的处理,有200多个,我想知道我是否可以使用循环(或其他方法)来读取文件并将它们合并成一个唯一的数据框。

非常感谢,希望我说的够清楚了。

【问题讨论】:

    标签: python pandas loops dataframe merge


    【解决方案1】:

    像这样使用 glob:

    import glob
    print(glob.glob("/home/folder/*.csv"))
    

    这会将您的所有文件列在一个列表中:['/home/folder/file1.csv', '/home/folder/file2.csv', .... ]

    现在,您可以遍历此列表:from 1->end, keeping 0 as your base,然后执行 pd.read_csv()pd.merge() - 它应该被排序!

    【讨论】:

      【解决方案2】:

      试试这个:

      import os
      import pandas as pd
      
      # update this to path that contains your .csv's
      path = '.' 
      
      # get files that end with csv in path
      dir_list = [file for file in os.listdir(path) if file.endswith('.csv')]
      
      # initiate empty list
      df_list = []
      
      # simple for loop with Try, Except that passes on iterations that throw errors when trying to 'read_csv' your files
      for file in dir_list:
          try:
              # append to df_list and set your indices to match across your df's for later pd.concat to work
              df_list.append(pd.read_csv(file).set_index(['Country', 'Year']))
          except: # change this depending on whatever Errors pd.read_csv() throws
              pass
      
      concatted = pd.concat(df_list)
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-08-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-03-20
        • 1970-01-01
        相关资源
        最近更新 更多