Pandas - объединяет информацию из нескольких текстовых файлов в один фрейм данных - PullRequest
0 голосов
/ 11 мая 2018

У меня есть несколько текстовых (.txt) файлов, сохраненных в папке. Я пытаюсь объединить их все в один кадр данных. До сих пор я был в состоянии объединить их, но не так, как мне хотелось бы.

Текстовые файлы (с именем yob####.txt, где #### - это год) содержат информацию, которая выглядит следующим образом:

Jennifer,F,58376
Amanda,F,35818
Jessica,F,33923
Melissa,F,31634
Sarah,F,25755
Heather,F,19975
Nicole,F,19917
Amy,F,19834
Elizabeth,F,19529
Michelle,F,19122
Kimberly,F,18499
Angela,F,17970

Я пытаюсь открыть каждый файл, добавить год в конец строки и двигаться дальше.

def main():
    files = file_paths(FILE_FOLDER) # returns a list of file paths, i.e. ["C:\Images\file.txt","C:\Images\file2.txt", ...]

    df = []
    for file in files:
        year = file.split("\\")[-1][3:7] 
        df.append(pd.read_table(file)+","+year)
    big_df = pd.concat(df, ignore_index=True, axis=1)
    big_df.to_csv("Combined.csv", header=False, index=False)

Это почти работает ... за исключением того, что он берет каждый файл и помещает данные в столбец, следующий файл во второй столбец, следующий файл в третий и т. Д.

Токовый выход: enter image description here

Ожидаемый вывод такой же, за исключением того, что при открытии файла 1881 он добавляет информацию в конец 1880. Затем 1882 идет после данных 1881 и т. Д. И т. П.

Ответы [ 2 ]

0 голосов
/ 11 мая 2018

Вы можете использовать pd.DataFrame.assign для плавного добавления столбца во время итерации.

Обратите также внимание, что рекомендуется использовать os.path.basename вместоразделение по определенным символам: это обеспечит работу вашего кода на нескольких платформах.

Обновлено : добавьте header=None и используйте pd.read_csv, как обсуждалось в другом ответе.

dfs = []
for file in files:
    year = os.path.basename(fn)[3:7]
    dfs.append(pd.read_csv(file, header=None).assign(Year=year))

df = pd.concat(dfs, ignore_index=True, axis=1)

Более эффективный способ - использовать понимание списка:

dfs = [pd.read_csv(file, header=None).assign(Year=os.path.basename(fn)[3:7]) \
       for file in files]

df = pd.concat(dfs, ignore_index=True, axis=1)
0 голосов
/ 11 мая 2018
  1. При read_table разделителем по умолчанию считается пробел (sep='\t').Измените read_table на read_csv, что означает ваш разделитель.В качестве альтернативы, укажите sep=',' для того же эффекта.
  2. Вы пытаетесь добавить новый столбец year, но делаете это неправильно.Вы можете использовать assign, чтобы добавить его в
  3. Объединить вертикально (axis=0, по умолчанию), а не горизонтально.

df_list = []
for file in files:
    year = ...
    df_list.append(pd.read_csv(file, header=None).assign(year=year))

big_df = pd.concat(df_list, ignore_index=True)
big_df.to_csv("Combined.csv", header=False, index=False)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...