Объедините несколько файлов CSV, которые совместно используют 2 столбца в один уникальный кадр данных - PullRequest
0 голосов
/ 17 марта 2020

У меня есть несколько файлов CSV (например, 200) в папке, которую я хочу объединить в один уникальный фрейм данных. Например, каждый файл имеет 3 столбца, 2 из которых являются общими для всех файлов (Страна и Год), третий столбец отличается в каждом файле. Например, один файл имеет следующие столбцы:

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, я хочу знать, могу ли я использовать al oop (или другой метод), чтобы прочитать файлы и объединить их в уникальный фрейм данных. Большое спасибо, надеюсь, я был достаточно ясен.

Ответы [ 2 ]

0 голосов
/ 17 марта 2020

Попробуйте это:

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)
0 голосов
/ 17 марта 2020

Используйте 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() - это должно быть отсортировано!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...