Добавить имя файла импортированного файла в фрейм данных - PullRequest
0 голосов
/ 19 октября 2018

Все еще довольно плохо знаком с Python, поэтому, пожалуйста, будьте терпеливы.У меня есть каталог файлов, все с похожей схемой именования.Имя файла выглядит следующим образом:

yob2004.txt yob2005.txt

Я пытаюсь открыть каждый из этих файлов и добавить их в кадр данных.Затем я хочу извлечь год из имени файла и добавить его в качестве нового столбца в фрейме данных.

Я могу получить его части, но не всю.

Вот извлечение годакод года из имени файла.

filenames = glob.glob('names/*.txt')

#split off the beginning of of he file path plus 'yob' and only keep 
everything after that. ex. 1180.txt
split1 = [i.split('\yob', 1)[1] for i in filenames]

#split of the .txt from the strings in the list above
split2 = [i.split('.', 1)[0] for i in split1]

Вот код для объединения всех файлов вместе

read_files = glob.glob("names/*.txt")

with open("allnames.txt", "wb") as outfile:
    for f in read_files:
        with open(f, "rb") as infile:
            outfile.write(infile.read())

Я думаю, что мне действительно нужно сделать, это прочитатьсначала файл в кадре данных, затем извлечь год из имени файла и записать его в новый столбец в кадре данных.Затем перейдите к следующему файлу.Полоскание.Повторите.

Любое руководство, как это сделать?

1 Ответ

0 голосов
/ 19 октября 2018

Это должно работать для ваших данных, предположим, у меня есть 2 файла yob2004.txt и yob2005.txt:

#yob2004
1,2,3,4
2,3,4,5
5,6,7,8

#yob2005
8,9,10,11
a,b,c,d
f,j,k
i,j,k,l

Мы видим, что эти файлы имеют разные типы данных и разное количество строк / столбцов, поэтомубудет рассмотрено большинство крайних случаев:

import pandas as pd
from os import walk

f = []
for (dirpath, dirnames, filenames) in walk('/home/dkennetz/yobDf'):
    for x in filenames:
        if x.startswith('yob'):
            f.append(x)
#f = ['yob2005.txt', 'yob2004.txt'] created a list from filenames in directory ^^^

data = pd.DataFrame() # initialize empty df
for filename in f:
    df = pd.read_csv(filename, names=['col1', 'col2', 'col3', 'col4']) # read in each csv to df
    df['filename'] = filename # add a column with the filename
    data = data.append(df) # add all small df's to big df 

data['filename'] = data['filename'].map(lambda x: x.lstrip('yob').rstrip('.txt')) # get rid of yob and .txt and just keep year
print(data)

вывод:

  col1 col2 col3 col4 filename
0    8    9   10   11     2005
1    a    b    c    d     2005
2    f    j    k  NaN     2005
3    i    j    k    l     2005
0    1    2    3    4     2004
1    2    3    4    5     2004
2    5    6    7    8     2004

Выходные данные сообщат, из какого файла они получены, поместив год рядом со столбцом и NAN, где dfs имеют разные размеры.

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