Лучший способ проанализировать несколько файлов и создать один фрейм данных

#python #pandas #dataframe #multidimensional-array

Вопрос:

Я хочу:

  1. Считывание файла во фрейм данных
  2. Выполните некоторые манипуляции с данными и т. Д.
  3. Скопируйте один столбец из фрейма данных
  4. Добавьте этот столбец во второй кадр данных
  5. Повторяйте 1-4, пока все файлы не будут прочитаны

Моя реализация заключается в:

 all_data = [[]] #list to store each set of values   for i in file_list:  filepath = path   i  df=pd.read_csv(filepath,sep='t',header=None,names=colsList)  #various data manipulation, melt, etc, etc, etc.  all_data.append(df['value'])  df_all = pd.DataFrame(all_data)  df_all=df_all.T #Transpose df_all.set_axis(name_list, axis=1, inplace=True) #fix the column names  

Как это можно было бы лучше реализовать?

Проблемы:

  • данные в списке python транспонируются (добавляются строками, а не столбцами)
  • Я не смог найти способ добавления по столбцам или переноса списка (с помощью списка python или с пандами), который работал бы без ошибок 🙁

Заранее спасибо…

Комментарии:

1. сначала вы могли бы использовать print() , чтобы увидеть, что у вас есть в переменной после чтения файла. возможно, вам следует перенести каждый df перед добавлением all_data . Или, может быть, вам следует проверить другие методы объединения/объединения кадров данных. Фрейм данных должен join() добавлять столбцы.

2. если бы вы использовали словарь {"col1": df['value'], ...} вместо list того pd.DataFrame(all_data) , чтобы создавать столбцы

Ответ №1:

Если бы вы хранили данные, dictionary то получили бы столбцы.

Но для каждой колонки нужно имя uniq — т. е. col1 , col2 , ect.

 import pandas as pd  all_data = {}  all_data['col1'] = [1,2,3] all_data['col2'] = [4,5,6] all_data['col3'] = [7,8,9]  new_df = pd.DataFrame(all_data)  print(new_df)  

Результат:

 col1 col2 col3 0 1 4 7 1 2 5 8 2 3 6 9  

То же самое с for -loop

Я использую io.StringIO только для имитации файлов в памяти, но вы должны использовать прямой путь к файлу.

 import pandas as pd import io  file_data = {  'file1.csv': '1t101n2t102n3t103',  'file2.csv': '4t201n5t202n6t202',  'file3.csv': '7t301n8t301n9t201', }  file_list = [  'file1.csv',  'file2.csv',  'file3.csv', ]  # ---  all_data = {}  for number, i in enumerate(file_list, 1):  df = pd.read_csv( io.StringIO(file_data[i]), sep='t', header=None, names=['value', 'other'] )  all_data[f'col{number}'] = df['value']  new_df = pd.DataFrame(all_data)  print(new_df)  

Вы также можете напрямую назначить новый столбец

 new_df[f'column1'] = old_df['value']  

 import pandas as pd import io  file_data = {  'file1.csv': '1t101n2t102n3t103',  'file2.csv': '4t201n5t202n6t202',  'file3.csv': '7t301n8t301n9t201', }  file_list = [  'file1.csv',  'file2.csv',  'file3.csv', ]  # ---  new_df = pd.DataFrame()  for number, i in enumerate(file_list, 1):  df = pd.read_csv( io.StringIO(file_data[i]), sep='t', header=None, names=['value', 'other'] )  new_df[f'col{number}'] = df['value']  print(new_df)