Как мне объединить (то есть 'concat') более 100 файлов .csv, используя модуль pandas? - PullRequest
1 голос
/ 05 июня 2019

Я новичок в науке о данных с Python.Итак, я хотел поиграть со следующими данными "https://www.ssa.gov/OACT/babynames/limits.html." Основная проблема здесь в том, что вместо того, чтобы давать мне один файл, содержащий данные за все годы, он содержит отдельный файл для каждого года. Кроме того, каждый отдельныйВ файле также отсутствуют заголовки столбцов.

К вашему сведению, данные содержат имена, пол и некоторый идентификационный номер всех зарегистрированных граждан США начиная с 1910 года. Данные доступны для общественности (предназначены для помощи демографам в отслеживании тенденций в популярныхимена).

Таким образом, одной из основных проблем, с которыми я сталкиваюсь, является необходимость редактировать более 100 файлов напрямую (вручную, открывать каждый и редактировать), чтобы гарантировать, что все заголовки столбцов совпадают (что являетсятребуется для работы такой функции, как concat).

Еще одна большая проблема - масштаб задачи. Очень и очень неэффективно использовать concat для файлов 100 *, а также использовать более 100 строккод просто сканирует / читает ваши данные

Конечно, «concat» был создан для этого, ноЯ думаю, что это неэффективно использовать около 130 файлов.Что касается отсутствующих заголовков столбцов, я вручную отредактировал некоторые файлы, но их слишком много, чтобы их можно было редактировать напрямую.

names2010 = pd.read_csv("../yob2010.txt")
names2011 = pd.read_csv("../yob2011.txt")
names = pd.concat([names2010, names2011])

Интуитивно, это то, чего я хочу избежать>

#rough notation 
names = pd.concat([names1910, names1911 ..., names2017, names2018])

это данные за два года.Мне нужно создать единый фрейм данных, состоящий из всех данных за период с 1910 по 2018 год.

Обновление: я выяснил, как объединить все разные файлы .txt, но все еще нужно разрешить заголовки столбцов.

dataframes = pd.read_csv("../yob1910.txt")
for year in range(1911, 2019):
       temp_frame = pd.read_csv("../yob{}.txt".format(year))
       dataframes = pd.concat([temp_frame, dataframes])

Ответы [ 2 ]

1 голос
/ 05 июня 2019

Попробуйте что-то вроде этого:

import pandas as pd
import glob

path = r'../' # use your path
all_files = glob.glob(path + "/*.txt")

list = []

for filename in all_files:
    df = pd.read_csv(filename)
    list.append(df)

final_df = pd.concat(list, axis=0, ignore_index=True)
0 голосов
/ 05 июня 2019

Добро пожаловать в Stackoverflow - и науку о данных!Кажется, вы можете быть достаточно рано на кривой обучения, чтобы не экспериментировать с нативными структурами Python - типами данных контейнера.Они могут быть чрезвычайно полезны для упрощения вашего кода с помощью циклов.

Один простой способ облегчить задачу - сохранить каждый набор данных в виде элемента в списке.Например (этот код не проверен):

dataframes = []
for year in range(1910, 2018):
    dataframes.append(pd.read_csv(f"../yob{year}.txt"))
names = pd.concat(dataframes)

Обратите внимание, что имена файлов составлены из года с использованием функции f-строки Python 3.6, но вы можете заменить это другими способами, чтобы добиться того жеРезультат должен работать с более ранней версией.Два варианта:

"../yob{}.txt".format(year)

и

"../yob%d.txt" % year
...